如何在流畅的nhibernate中映射字符串和IList <string>的字典?

时间:2015-08-10 15:07:18

标签: c# fluent-nhibernate fluent-nhibernate-mapping

我有一个类,其中包含一组结构为字典的值,其中键为字符串,每个元素都是字符串列表。

如何将此映射为单独的表而无需定义其他类?

我已尝试过以下代码,但无法使其正常运行。

public class User
{
  property virtual Guid Id {get; set; }
  property IDictionary<string, List<string>> Rights;
}

映射

public class UserMap : ClassMap<User>
{
  public UserMap()
  {
    Id(p => p.Id).GeneratedBy.Guid();
    HasMany(p => p.Rights).
                 Table("Rights").
                 KeyColumn("Key").
                 Element("Right").
                 AsMap<string>("Rights");

目前,我在黑暗中摸索着如何让它发挥作用。映射字典似乎很容易&lt; string,string&gt;但也许不可能映射字典&lt; string,List&lt;串GT;&GT;以这种方式?

1 个答案:

答案 0 :(得分:0)

一种选择是作弊并使用仍然使用IDictionary<string, string>的支持字段,但将其公开为IDictionary<string, List<string>>

public class User
{
    public virtual Guid Id { get; set; }

    // Map this one
    protected internal virtual IDictionary<string, string> RightsInternal { get; set; }

    // Use this one
    public virtual IDictionary<string, List<string>> Rights
    {
        get { return RightsInternal.ToDictionary(_ => _.Key, _ => _.Value.Split('|').ToList()); }
        set { RightsInternal = value.ToDictionary(_ => _.Key, _ => string.Join("|", _.Value)); }
    }
}

请确保您只映射IdRightsInternal(您可以使用NHibernate映射protected internal属性,如here所述。)

干净的解决方案是将此关联扩展为OneToMany关系,或者更进一步使用NoSQL数据库,为键值存储提供出色的支持。

另外,请查看this post