如何映射具有IList值的IDictionary?
问题描述:
使用NHibernate,我怎么可以映射以下情形:如何映射具有IList值的IDictionary?
public class User
{
public virtual IDictionary<Project, IList<Role>> ProjectAssignments { get; set; }
}
在我为User
,Project
和Role
并为关系的第4*立的表的数据库。
任何帮助,将不胜感激。
答
你不能 - 从Ayende's blog discussing <map>
我想指出的是,我仍然没有涵盖所有的选项<地图/>,还有 甚至更多的选择(虽然,IDictionary的<ķ ,IList < V >>不是可能映射的 ,因为需要这样做的问题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.
}
我只是映射项目分配在自己的权利的持久化类,和User.Assignments收藏作为一个正常的一个一对多的任何味道。最后,我想补充的方法来提取细节到字典中(或者可能是一个ILookup如果你使用框架V3.5):
ILookup<Project, Role> GetRolesByProject() {
return Assignments.ToLookup(x => x.Project, x => x.Role);
}
我有点困惑的一切是怎么回事:喜欢的事以适应。您能否给我举一个中介实体将会是什么样子的例子,以及我如何映射它? – 2009-07-23 11:27:45
我现在已经扩展了我的答案。 – 2009-07-23 13:00:45
非常感谢代码:)它工作! – 2009-07-23 14:59:27