NHibernate:保存带有不可为空约束的行李时出错
给出了Item和itemtransformation表,其中后者在Item上有一个不可为空的外键 ItemTranslation.hbm.xml只有其属性Text和LanguageCode,它不映射项 Item.hbm.xml: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
<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);
...