Fluent-NHibernate:如何通过独特的约束创建多对多关系

Lul*_*aby 5 many-to-many unique fluent-nhibernate

我想创建多对多关系,但我希望在新表(MessageReceivers)中对两个列都有唯一的约束(AdvanceMessageId,UserId):

mapping.HasManyToMany(x => x.Receivers)
       .WithParentKeyColumn("AdvanceMessageId")
       .WithChildKeyColumn("UserId")
       .Cascade.All()
       .LazyLoad()
       .WithTableName("MessageReceivers");
Run Code Online (Sandbox Code Playgroud)

感谢帮助

bra*_*arb 6

旧帖...但万一其他人到这里寻找答案:

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


mapping.HasManyToMany(x => x.Users)
       .WithTableName("MessageReceivers")
       .WithParentKeyColumn("UserId")
       .WithChildKeyColumn("AdvanceMessageId")
       .Inverse().AsSet();
Run Code Online (Sandbox Code Playgroud)

这将在使用两列的链接表上设置唯一的复合主键约束.(聚集索引)

缺点是AsSet()不能与IList类型的集合属性一起使用,所以没有for的循环没有.

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


有关Fluent Nhibernate的集合管理的更多信息:

清单:有序的实体集合,允许重复.在代码中使用.net IList.索引列需要在NHibernate中映射.

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

行李:无序的实体列表,允许重复.在代码中使用.net IList.列表的索引列未映射,也不受NHibernate的尊重.