我想创建多对多关系,但我希望在新表(MessageReceivers)中对两列都有唯一的约束(AdvanceMessageId,UserId):
mapping.HasManyToMany(x => x.Receivers)
.WithParentKeyColumn("AdvanceMessageId")
.WithChildKeyColumn("UserId")
.Cascade.All()
.LazyLoad()
.WithTableName("MessageReceivers");
感谢您的帮助
答案 0 :(得分:6)
旧帖...但是如果其他人到达这里寻找答案:
您需要将 .AsSet()添加到HasManyToMany映射定义中。
即
mapping.HasManyToMany(x => x.Users)
.WithTableName("MessageReceivers")
.WithParentKeyColumn("UserId")
.WithChildKeyColumn("AdvanceMessageId")
.Inverse().AsSet();
这将在使用两列的链接表上设置唯一的复合主键约束。 (聚集索引)
缺点是AsSet()不能与IList类型的集合属性一起使用,因此没有for循环的for循环。
我一直在使用ICollection并将它们实例化为我的应用程序的HashSet,它运行良好。
使用Fluent Nhibernate进行收集管理的更多信息:
列表:有序的实体集合,允许重复。在代码中使用.net IList。索引列需要在NHibernate中映射。
设置:无序的唯一实体集合,不允许重复。在代码中使用Iesi.Collection.ISet。重写GetHashCode和Equals以指示重复的业务定义很重要。可以通过定义orderby或通过定义生成SortedSet结果的比较器来进行排序。
Bag:无序的实体列表,允许重复。在代码中使用.net IList。列表的索引列没有映射,也没有被NHibernate尊重。
答案 1 :(得分:2)
您还应该映射关系的反面,如
mapping.HasManyToMany(x => x.Users)
.WithTableName("MessageReceivers")
.WithParentKeyColumn("UserId")
.WithChildKeyColumn("AdvanceMessageId")
.Inverse();
在最新的Fluent NHibernate中你必须改变
WithTableName - >表
WithParentKeyColumn - > ParentKeyColumn
WithChildKeyColumn - > ChildKeyColumn