流利的NHibernate多对多
时间:2020-03-06 14:29:09 来源:igfitidea点击:
我正在使用Fluent NHibernate,但在与我的一个班级建立多对多关系时遇到了一些问题。这可能是一个愚蠢的错误,但为了使它正常工作,我已经被卡住了一点。无论如何,我有几个具有很多关系的课程。
public class Person { public Person() { GroupsOwned = new List<Groups>(); } public virtual IList<Groups> GroupsOwned { get; set; } } public class Groups { public Groups() { Admins= new List<Person>(); } public virtual IList<Person> Admins{ get; set; } }
映射看起来像这样
人: ...
HasManyToMany<Groups>(x => x.GroupsOwned) .WithTableName("GroupAdministrators") .WithParentKeyColumn("PersonID") .WithChildKeyColumn("GroupID") .Cascade.SaveUpdate();
群组:...
HasManyToMany<Person>(x => x.Admins) .WithTableName("GroupAdministrators") .WithParentKeyColumn("GroupID") .WithChildKeyColumn("PersonID") .Cascade.SaveUpdate();
当我运行集成测试时,基本上是在创建一个新的人员和组。将组添加到Person.GroupsOwned。如果从存储库取回Person对象,则GroupsOwned等于初始组,但是,如果我检查Group.Admins的计数,则取回该组时,计数为0。Join表具有GroupID和PersonID已保存在其中。
感谢任何建议。
解决方案
我们确定要将该人添加到Groups.Admin中吗?我们必须同时建立两个链接。
你有三张桌子吧?
人员,组和组管理员
当我们添加到双方时,我们会得到
人(id为p1)
群组(ID为g1)
在GroupAdministrators中,我们有两列和一个表
(p1,g1)
(p1,g1)
单元测试代码如下所示。
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();
然后在测试中创建一个新的上下文,并进行测试以查看上下文中的内容,然后返回正确的内容,但是表全都被破坏了?
它向表中添加了两个记录这一事实看起来像我们缺少逆属性。由于人和组都被更改,因此NHibernate将关系保持两次(每个对象一次)。反向属性专门用于避免这种情况。
我不确定如何在代码映射中添加它,但是该链接显示了如何在XML中添加它。
@圣地亚哥,我认为你是对的。
答案可能只是我们需要删除ManyToMany声明之一,而对Fluent进行更多研究,看起来它足够聪明才能为我们完成。