NHibernate 没有插入 children

NHibernate not inserting children

我正在构建一个多语言应用程序,其中包含一些动态翻译。因此,我选择为产品制作单独的表格,其中包括翻译。

不,我无法插入翻译,它们是产品的一部分。插入哪个。

  <class name="Product" table="Product">
    <id name="Id">
      <generator class="native" />
    </id>
    <property name="SomeOtherStuff" column="SomeOtherStuff" />
    <set name="NaamTranslations" cascade="all">
      <key column="ProductId" not-null="true" />
      <one-to-many class="ProductTranslation" />
    </set>
  </class>

  <class name="ProductTranslation"
         table="ProductTranslation" lazy="false">
    <id name="Id">
      <generator class="native" />
    </id>
    <many-to-one name="Product" column="ProductId" not-null="true" 
                 index="UQ_ProductTranslation" class="Product"
                 cascade="all-delete-orphan" />
    <property name="CultureCode" column="LanguageCode" 
              not-null="true" index="UQ_ProductTranslation" />
    <property name="Name" column="Name" not-null="true" />
  </class>

我的猜测是问题出在 NHibernate 的配置中。因为我可以在整个代码中跟踪产品的创建。我还打开了 show_sql,它显示了产品的创建,但缺少 ProductTranslations 的插入内容。

INSERT INTO dbo.Product (SomeOtherStuff) VALUES (@p0); 
 select SCOPE_IDENTITY(); @p) = 'Hello this is a test' [Type: String (4000)]

以上映射应该有效。它只会生成不总是想要的 SQL 语句。

  1. 插入 parent 产品
  2. 插入 child table ProductTranslation,而不引用产品 table ProductId 列必须可以为空)
  3. 更新 child table 与 ProductId 参考

所以,这个有点复杂的 SQL 语句即使对于这种 C# 赋值也适用

var p = new Product();
var tr1 = new ProductTranslation();
var tr2 = new ProductTranslation();
p.NaamTranslations.Add(tr1);
p.NaamTranslations.Add(tr2);

session.Save(p);

为了避免那些插入和更新,并且只有一个 INSERT,我们可以使用 inverse 映射。就是这样

<class name="Product" table="Product">
    ...
    <set name="NaamTranslations" cascade="all" inverse="true">

但现在我们必须在 C# 中设置引用的两边

var p = new Product();
var tr1 = new ProductTranslation();
var tr2 = new ProductTranslation();
p.NaamTranslations.Add(tr1);
p.NaamTranslations.Add(tr2);

// too soon - relation back to product is missing
//session.Save(p);

// assign reference 
tr1.Product = p;
tr2.Product = p;
// now cascade will work
session.Save(p);

NHibernate 现在将:

  1. 插入 parent
  2. 将完整记录插入 child(以后不再更新)