【问题标题】:NHibernate doesn't save composite data entityNHibernate 不保存复合数据实体
【发布时间】:2014-04-03 22:47:27
【问题描述】:

所以,就在上周,我问了一个关于如何处理many-to-many with extra columns nhibernate 的问题。答案似乎很清楚,只需使用链接表并进行两个多对一。 但是,由于我使用 Entity Developer 来生成我的模型,所以我在使用该方法时遇到了问题...

无论如何,我继续研究多对多问题,发现也许我可以创建某种复合元素,它的行为很像多对多,但具有额外的属性(!)

这将是新模型:

User 的映射文件如下所示:

<hibernate-mapping ...>
  <class name="User" table="Users">
    <id name="UId" type="Int32">...</id>
    <property name="UserName" type="String">...</property>

    <set name="Groups" table="UGLinks" inverse="true" generic="true">
      <key>
        <column name="UId" />
      </key>
      <composite-element class="UGLinkExtra">
        <many-to-one name="Groups" class="Group" fetch="join">
          <column name="GId" />
        </many-to-one>
        <property name="Date">
          <column name="Date" not-null="true" />
        </property>
      </composite-element>
    </set>

  </class>
</hibernate-mapping>

所以我有这个Composite-element,它模拟了多对多的外观,但有一个额外的列属性。

假设我有一个 User u 和一个 Group g 我想链接。那么这只是一个问题

u.Groups.add(new UGLinkExtra() {Groups = g, Date = DateTime.Now});

在 NHibernate 中,我还看到添加了一个链接(如果我添加了 u.Groups,我会得到一个包含 g 的(UGLinkExtra)列表),但是我无法将它保存到数据库中! 即使我这样做session.SaveOrUpdate(u)(或g,我都尝试过)它永远不会被写入数据库......我看到的只有SQL:

NHibernate: SELECT this_.UId as UId0_0_, this_.UserName as UserName0_0_ FROM Users this_
NHibernate: SELECT this_.GId as GId2_0_, this_.GroupName as GroupName2_0_ FROM Groups this_

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    这里的问题与&lt;set&gt; 的设置有关。你告诉 NHiberante &lt;set name="Groups" ... inverse="true" 这意味着:NHibernate,不要持久化这个集合的项目。这些太聪明了,他们会坚持自己……

    如果我们使用&lt;one-to-many&gt; 映射,这通常是正确的。但是&lt;composite-element&gt; 完全依赖于它的父集合......来管理它的写操作。所以把映射改成inverse="false"

    <set name="Groups" table="UGLinks" inverse="false" ...
    

    【讨论】:

    • 嗯,好吧,这样可以,然后我注意到我只能将组添加到用户,或者相反(取决于inverse 选项)。有什么办法可以同时添加吗?
    • 我刚刚尝试在这里解释相同的stackoverflow.com/questions/22824660。我的(只是我的但非常强烈) 意见是,将many-to-many 替换为first-level-citizen PairingEntity。用标准的一对多和多对一元素映射它,并且......只是获得和利润。您可以在这里进行实验...您可以找到自己的方式,(我也尝试过;)但是一旦可以改变方法...它会变得更容易...
    • 实际上我的 hbm 生成器有问题 (Entity Developer) 所以我无法使用 2 * Many-to 创建用户到用户(多对多)的链接- 一种方法。 (我需要这个:stackoverflow.com/a/504845/1140368),但找不到生成它的方法。因此,由于这种方法效果很好,我打算使用它,只是我似乎无法再次删除链接......知道吗?尝试myUser.Managers.Remove(new UULinkExtra(){Manager = myManager});
    • Markus,对不起,正如我试图提到的......我几乎无法帮助你处理多对多或一些复合键......等等。我不使用这些。简单,强大。我会说。但是提出新问题,也许是其他人......
    • 好的,就历史而言,它与myUser.Managers.Remove(new UULinkExtra(){Manager = myManager, Date = 2014-04-03}); 一起工作,即。它必须是确切的对象,所以我必须搜索整个记录才能删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多