22

我正在使用 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 保存在其中。

感谢您提供的任何建议。

4

4 回答 4

39

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

I'm not sure about how to add it in mapping in code, but the link shows how to do it in XML.

于 2008-09-20T17:57:59.857 回答
7

@Santiago I think you're right.

The answer might just be that you need to remove one of your ManyToMany declarations, looking more at Fluent it looks like it might be smart enough to just do it for you.

于 2008-09-20T18:08:55.570 回答
0

您确定将 Person 添加到 Groups.Admin 吗?您必须创建两个链接。

于 2008-09-20T16:44:01.173 回答
0

你有三张桌子对吧?

人员、组和组管理员

当你添加到双方你得到

人(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();

然后在您的测试中,您创建了一个新的上下文,并测试以查看上下文中的内容,然后您得到了正确的结果,但是您的表都被弄乱了?

于 2008-09-20T17:48:43.233 回答