流利的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进行更多研究,看起来它足够聪明才能为我们完成。