NHibernate 具有同一类的多对多

Posted

技术标签:

【中文标题】NHibernate 具有同一类的多对多【英文标题】:NHibernate Many-to-Many with same class 【发布时间】:2013-06-08 17:28:14 【问题描述】:

如果之前已经回答过这个问题,我们深表歉意。我试过谷歌,但找不到答案。

现在我有课

public class User

    public virtual string Username  get; set; 
    public virtual string Name  get; set; 

    public virtual ISet<User> Teamleaders  get; set;
    public virtual ISet<User> Staff  get; set;

teamLeaders 存储该用户拥有的所有团队负责人。 员工存储团队负责人拥有的所有员工。

这是多对多的关系。

目前我的XML文件如下所示

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="SDReward"
               namespace="SDReward.Domain">
  <class name="User">
    <id name="Username" />
    <property name="Name" />

  </class>
</hibernate-mapping>

我已经让它与以下数据一起工作。它从 teamleaderstaff 表中获取数据

<set name="Teamleaders" table="teamleaderstaff">
  <key column="TeamleaderId" />
  <many-to-many column="UserId" class="User" />
</set>

<set name="Staff" table="teamleaderstaff">
  <key column="UserId" />
  <many-to-many column="TeamleaderId" class="User" />
</set>

但是,当我执行插入操作时,它会将它们插入数据库中...例如,如果我向用户添加 1 个团队负责人并将该用户添加为团队负责人的员工,它会使用相同的数据进行 2 次插入。

【问题讨论】:

【参考方案1】:

在您的情况下,多对多映射可能看起来像

<set name="Teamleaders" table="teamleaderstaff" lazy="true">
  <key column="UserId"/>
  <many-to-many class="User" column="TeamleaderId"/>
</set>


<set name="Staff" table="teamleaderstaff" lazy="true" inverse="true" >
  <key column="TeamleaderId"/>
  <many-to-many class="User" column="UserId"/>
</set>

1) 区别在于&lt;key column 映射。

2) 在insert期间,其中一个集合(Staff)被标记为inverse="true",所以不会触发双插入

【讨论】:

谢谢。不知道我是怎么不接受逆向的……有没有经验法则(一般来说)哪一方使用逆向? 在多对多的情况下,它实际上主要取决于您。在自引用实体的情况下更是如此...... ;)

以上是关于NHibernate 具有同一类的多对多的主要内容,如果未能解决你的问题,请参考以下文章

具有相同 ID 键字段的多对多

在 NHibernate 上的多对多关系上添加自定义列

用NHibernate处理带属性的多对多关系

流利的 NHibernate 多对多创建附加表

实体框架代码优先,同一张表上的多对多关系

定义引用同一个表的多对多关系(EF7/core)