给定表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来修复它。
但这两种方式都很难看。
还有其他可能吗?也许袋子映射有一些变化?
提前谢谢。
答案 0 :(得分:1)
如果我们不想使用逆映射(见下文) ..我们必须将列留在DB 可以为空。
这就是它的工作原理。 NHibernate将
另一种方式:反向映射
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>
这是正确的解决方案吗?