流利的NHibernate多对多

时间:2008-09-20 14:58:51

标签: c# nhibernate fluent-nhibernate fluent

我正在使用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 个答案:

答案 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();

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