Fluent-NHibernate:如何使用唯一约束创建多对多关系

时间:2009-11-12 08:05:26

标签: fluent-nhibernate many-to-many unique

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

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

感谢您的帮助

2 个答案:

答案 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