NHibernate不会保存复合数据实体

时间:2014-03-28 11:53:44

标签: c# nhibernate

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

无论如何,我继续调查多对多问题,发现也许我可以创建某种复合元素,这种复合元素很像多对多,但有一个额外的属性(!)

这将是新模型: Model

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 uGroup g

这只是一个问题
u.Groups.add(new UGLinkExtra() {Groups = g, Date = DateTime.Now});

在NHibernate中我也看到添加了一个链接(如果我做了u.Groups我得到一个列表(UGLinkExtra),其中包含g),但是我无法将其保存到数据库中! 即使我做session.SaveOrUpdate(u)(或者我已尝试过两者),它也永远不会被写入数据库......只有我看到的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_

1 个答案:

答案 0 :(得分:2)

此处的问题与<set>的设置有关。你告诉NHiberante <set name="Groups" ... inverse="true"这意味着:NHibernate,不要坚持这个集合的项目。这些都很聪明,他们会坚持下去......

如果我们使用<one-to-many>映射,那通常都是正确的。但<composite-element>完全依赖于其父集合......来管理其写操作。因此,将映射更改为 inverse="false"

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