2009-11-12 54 views

回答

5

旧的帖子...但万一别人到达这里寻找答案:

您需要将.AsSet()添加到HasManyToMany映射定义中。


mapping.HasManyToMany(x => x.Users) 
     .WithTableName("MessageReceivers") 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("AdvanceMessageId") 
     .Inverse().AsSet(); 

这将建立一个唯一的,复合主键上,使用两列的链接表约束。(聚集索引)

缺点是AsSet()不能用于IList类型的集合属性,所以没有for循环没有投射。

我一直在使用ICollection并将它们实例化为我的应用程序的HashSet,它运行良好。在征收管理


更多信息与功能NHibernate:

列表:有序实体收集,复制允许的。在代码中使用.net IList。索引列需要在NHibernate中映射。

设置:唯一实体的无序集合,不允许重复。在代码中使用Iesi.Collection.ISet。重写GetHashCode和Equals以指示重复的业务定义很重要。可以通过定义orderby或通过定义导致SortedSet结果的比较器来排序。

Bag:无序的实体列表,允许重复。在代码中使用.net IList。该列表的索引列未被映射,并且不被NHibernate支持。

+0

非常有价值的信息;感谢分享。 – contactmatt 2015-09-02 02:20:10

2

你也应该关系的反向端地图像

mapping.HasManyToMany(x => x.Users) 
     .WithTableName("MessageReceivers") 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("AdvanceMessageId") 
     .Inverse(); 

在最新的功能NHibernate你会要改变

  • WithTableName - >表

  • WithParentKeyColumn - > ParentKeyColumn

  • WithChildKeyColumn - > ChildKeyColumn

相关问题