如何映射具有IList值的IDictionary?

问题描述:

使用NHibernate,我怎么可以映射以下情形:如何映射具有IList值的IDictionary?

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

在我为UserProjectRole并为关系的第4*立的表的数据库。

任何帮助,将不胜感激。

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

我想指出的是,我仍然没有涵盖所有的选项<地图/>,还有 甚至更​​多的选择(虽然,IDictionary的<ķ ,IList < V >>不是可能映射的 ,因为需要这样做的问题SQL语句)。

您需要一些中间实体/组件。我可能会有一个ProjectAssignment实体来分解用户,项目和角色之间的关系 - 随着时间的推移,它可能会增加额外的属性(比如你想跟踪一段时间内对任务的更改,所以它得到StartDateEndDate属性)。

喜欢的东西:

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. 
} 

我只是映射项目分配在自己的权利的持久化类,和User.Assignments收藏作为一个正常的一个一对多的任何味道。最后,我想补充的方法来提取细节到字典中(或者可能是一个ILookup如果你使用框架V3.5):

ILookup<Project, Role> GetRolesByProject() { 
    return Assignments.ToLookup(x => x.Project, x => x.Role); 
} 
+0

我有点困惑的一切是怎么回事:喜欢的事以适应。您能否给我举一个中介实体将会是什么样子的例子,以及我如何映射它? – 2009-07-23 11:27:45

+0

我现在已经扩展了我的答案。 – 2009-07-23 13:00:45

+0

非常感谢代码:)它工作! – 2009-07-23 14:59:27