我正在使用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保存在其中。
感谢你提出任何建议。
答案 0 :(得分:39)
它向表中添加两条记录的事实看起来好像缺少inverse attribute。由于人和组都在被更改,因此NHibernate将关系持续两次(每个对象一次)。 inverse属性专门用于避免这种情况。
我不确定如何将其添加到代码中的映射中,但链接显示了如何在XML中执行此操作。
答案 1 :(得分:7)
@Santiago我认为你是对的。
答案可能只是你需要删除你的一个ManyToMany声明,更多关注Fluent看起来它可能足够聪明,只为你做。
答案 2 :(得分:0)
您确定要将人员添加到Groups.Admin吗?你必须建立两个链接。
答案 3 :(得分:0)
你有三张桌子吗?
人员,群组和群组管理员
当你添加到双方时,你得到
人物(身份证号码为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();
然后在你的测试中你会创建一个新的上下文,并测试一下上下文中的内容,然后你找回正确的内容,但是你的表格都被搞砸了?