Nhibernate 如何映射具有IList值的IDictionary?

Nhibernate 如何映射具有IList值的IDictionary?,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,使用NHibernate,我如何映射以下场景: public class User { public virtual IDictionary<Project, IList<Role>> ProjectAssignments { get; set; } } 公共类用户 { 公共虚拟IDictionary项目分配{get;set;} } 在数据库中,我为用户、项目和角色设置了单独的表,并为关系设置了第四个表 任何帮助都将不胜感激。您不能-从 我想指出的是,我还没有

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

public class User
{
    public virtual IDictionary<Project, IList<Role>> ProjectAssignments { get; set; }
}
公共类用户
{
公共虚拟IDictionary项目分配{get;set;}
}
在数据库中,我为
用户
项目
角色
设置了单独的表,并为关系设置了第四个表

任何帮助都将不胜感激。

您不能-从

我想指出的是,我还没有在这方面涵盖所有的选择 甚至还有更多的选项(尽管,IDictionary并非如此) 可以映射,用于需要映射的有问题的SQL语句)

您需要一些中间实体/组件。我可能会有一个ProjectAssignment实体来打破用户、项目和角色之间的不可分割的关联——随着时间的推移,它可能会增加额外的属性(比如说,您希望跟踪任务随时间的变化,因此它会得到
StartDate
EndDate
属性)

比如:

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.
}
ILookup<Project, Role> GetRolesByProject() {
    return Assignments.ToLookup(x => x.Project, x => x.Role);
}  
公共类用户{
//…其他属性等。
公共虚拟ISet分配{get;set;}
}
公共类项目{
//…其他属性等。
公共虚拟ISet分配{get;set;}
}
公共阶级角色{
//…其他属性等。
}
公开课作业
{
公共虚拟Int64{get;set;}
公共虚拟用户用户{get;set;}
公共虚拟项目{get;set;}
公共虚拟角色{get;set;}
//…其他属性等。
}
我只需要将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.
}
ILookup<Project, Role> GetRolesByProject() {
    return Assignments.ToLookup(x => x.Project, x => x.Role);
}  
ILookup GetRolesByProject(){
returnassignments.ToLookup(x=>x.Project,x=>x.Role);
}  

我有点搞不清楚每件事将如何适应。你能给我一个例子,说明中间实体是什么样子的,以及我将如何映射它吗?