流利的NHibernate多对多

我正在使用Fluent NHibernate并且遇到一些问题,我的一个类可以设置多对多的关系。 这可能是一个愚蠢的错误,但我已经陷入了一点点试图让它运作。 无论如何,我有几个有许多关系的课程。

public class Person { public Person() { GroupsOwned = new List(); } public virtual IList GroupsOwned { get; set; } } public class Groups { public Groups() { Admins= new List(); } public virtual IList Admins{ get; set; } } 

映射看起来像这样

人:……

 HasManyToMany(x => x.GroupsOwned) .WithTableName("GroupAdministrators") .WithParentKeyColumn("PersonID") .WithChildKeyColumn("GroupID") .Cascade.SaveUpdate(); 

团体:……

  HasManyToMany(x => x.Admins) .WithTableName("GroupAdministrators") .WithParentKeyColumn("GroupID") .WithChildKeyColumn("PersonID") .Cascade.SaveUpdate(); 

当我运行集成测试时,基本上我正在创建一个新人和组。 将组添加到Person.GroupsOwned。 如果我从存储库中获取Person对象,则GroupsOwned等于初始组,但是,当我检查Group.Admins上的计数时,如果我返回组,则计数为0. Join表具有GroupID和PersonID保存在其中。

感谢您的任何建议。

它向表中添加两条记录这一事实看起来就像缺少一个反向属性 。 由于人和组都在被更改,因此NHibernate将关系持续两次(每个对象一次)。 inverse属性专门用于避免这种情况。

我不确定如何在代码中添加映射,但链接显示了如何在XML中执行它。

@Santiago我认为你是对的。

答案可能只是你需要删除一个ManyToMany声明,更多关注Fluent看起来它可能足够聪明,只为你做。

您确定要将人员添加到Groups.Admin吗? 你必须做两个链接。

你有三张桌子吗?

人员,组和GroupAdministrators

当你添加到双方时,你会得到

人(ID为p1)组(ID为g1)

在GroupAdministrators中,您有两列和一个具有的表

(P1,G1)

(P1,G1)

并且您的unit testing代码如下所示。

 Context hibContext //Built here Transaction hibTrans //build and start the transaction. Person p1 = new Person() Groups g1 = new Groups() p1.getGroupsOwned().add(g1) g1.getAdmins().add(p1) hibTrans.commit(); hibContext.close(); 

然后在你的测试中你创建一个新的上下文,并测试以查看上下文中的内容,然后你找回正确的内容,但是你的表格都被搞砸了?