如何映射具有IList值的IDictionary?

时间:2009-07-23 10:52:56

标签: nhibernate nhibernate-mapping

使用NHibernate,我该如何映射以下场景:

public class User
{
    public virtual IDictionary<Project, IList<Role>> ProjectAssignments { get; set; }
}

在数据库中,我有UserProjectRole的单独表格以及关系的第四个表格。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

你不能 - 从Ayende's blog discussing <map>

  

我想指出,我还没有涵盖&lt; map /&gt;的所有选项   甚至更多的选择(尽管,IDictionary&lt; K,IList&lt; V&gt;&gt;不是什么了   可能需要映射,以便执行此操作所需的有问题的SQL语句。

您需要一些中间实体/组件。我可能有一个ProjectAssignment实体来打破用户,项目和角色之间的关联 - 随着时间的推移它可能会增加额外的属性(假设你想跟踪一段时间内对分配的更改,所以它得到{{1 }}和StartDate属性)。

类似的东西:

EndDate

我只是将ProjectAssignment映射为一个持久化的类,而User.Assignments集合作为正常的一对多的任何风格。最后,我添加了一个方法来将细节提取到字典中(或者如果你使用的是Framework v3.5,可能还有ILookup):类似于:

public class User {
  // ... other attributes etc.
  public virtual ISet<ProjectAssignment> Assignments {get;set;}
}

public class Project {
  // ... other attributes etc.
  public virtual ISet<ProjectAssignment> Assignments {get;set;}
}

public class Role {
  // ... other attributes etc.
}

public class ProjectAssignment
{
  public virtual Int64 {get;set;}
  public virtual User User {get;set;}
  public virtual Project Project {get;set;}
  public virtual Role Role {get;set;}
  // ... other attributes etc.
}