NHibernate:保存带有不可为空约束的行李时出错

NHibernate:保存带有不可为空约束的行李时出错,nhibernate,Nhibernate,给出了Item和itemtransformation表,其中后者在Item上有一个不可为空的外键 ItemTranslation.hbm.xml只有其属性Text和LanguageCode,它不映射项 Item.hbm.xml: <bag name="Translations" cascade="all-delete-orphan"> <key column="ItemID" /> <one-to-many class="ItemTranslation, S

给出了Item和itemtransformation表,其中后者在Item上有一个不可为空的外键

ItemTranslation.hbm.xml只有其属性Text和LanguageCode,它不映射项

Item.hbm.xml:

<bag name="Translations" cascade="all-delete-orphan">
  <key column="ItemID" />
  <one-to-many class="ItemTranslation, SomeNamespace" />
</bag>
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.
我可以通过将ItemID尽可能多地映射到IssuedItemTranslation.hbm.xml中的一个来修复它,或者使列为空

但这两种方式都有点丑陋

还有其他可能性吗?也许在包映射中有一些变化


提前感谢您。

它在绘制行李时起作用,如下所示:

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


这是正确的解决方案吗?

如果我们不想使用反向映射(见下文)。。我们必须将该列保留为DB可空的

这就是它的工作原理。恩希伯内特将

  • 插入子项(或父项)
  • 插入父项(或子项)此处阅读更多信息
  • 使用父id更新子项
另一种方法:逆映射

ItemTranslatin
上的显式
Item
反向引用映射上没有什么不好的地方。我总是这样做。如果我们真的不喜欢。。它可以是受保护的财产

但是,我们需要逆映射

<bag name="Translations" cascade="all-delete-orphan" inverse="true">
此解决方案不要求项列可为null

这就是我的建议。请在此处阅读更多信息:

<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);
...