NHibernate:使用NOT-Nullable Constraint保存Bag时出错

时间:2017-03-30 10:54:16

标签: nhibernate

给定表Item和ItemTranslation,其中后者在Item上有 NOT-Nullable 外键。

ItemTranslation.hbm.xml只有Text和LanguageCode属性,它 NOT map Item

Item.hbm.xml:

<bag name="Translations" cascade="all-delete-orphan">
  <key column="ItemID" />
  <one-to-many class="ItemTranslation, SomeNamespace" />
</bag>

现在,当我执行以下操作时:

Item item = new Item();
item.Translations.Add( new ItemTranslation { LanguageCode = "DE", Text = "Test DE" } );
item.Translations.Add( new ItemTranslation { LanguageCode = "EN", Text = "Test EN" } );
item.Save();

NHibernate抛出以下异常:

System.Data.SqlClient.SqlException : Cannot insert the value NULL into column 'ItemID', table 'someDb.dbo.ItemTranslation'; column does not allow nulls. INSERT fails.
Cannot insert the value NULL into column 'ItemID', table 'someDb.dbo.ItemTranslation'; column does not allow nulls.

我可以通过在IssuedItemTranslation.hbm.xml中将ItemID映射为多对一或使列为NULL来修复它。

但这两种方式都很难看。

还有其他可能吗?也许袋子映射有一些变化?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果我们不想使用逆映射(见下文) ..我们必须将列留在DB 可以为空

这就是它的工作原理。 NHibernate将

  • 插入子项(或父项)
  • 插入父(或儿童)在此处阅读更多内容9.6. Flush
  • 更新包含父ID的子女

另一种方式:反向映射

Item 上的显式ItemTranslatin后向参考映射没有任何不妥。我总是这样做。如果我们真的不喜欢它,它可能是受保护的财产。

但是,我们需要逆映射

<bag name="Translations" cascade="all-delete-orphan" inverse="true">

并且还设置了双方的参考。

Item item = new Item();
var tr1 = new ItemTranslation { 
  LanguageCode = "DE", 
  Text = "Test DE"
  Item = item } ;
item.Translations.Add(tr1);
...

此解决方案不要求项目列可以为空...

这就是我建议的方式。在这里阅读更多内容:

答案 1 :(得分:0)

在对包进行映射时如下:

<bag name="Translations" cascade="all-delete-orphan">
  <key column="ItemID" not-null="true" update="false" />
  <one-to-many class="ItemTranslation, SomeNamespace" />
</bag>

这是正确的解决方案吗?