我有父表"父母" with column" SpokenlanguageId"," WrittenlanguageId"。这两列由列#34; languageid"引用。在子表中(两个父表列都由相同的子表列引用)。
在父表hbm文件中,我在父表列(SpokenlanguageId,WrittenlanguageId)中包含多对一关系,其中cascade ="无" 我的方案是仅在父表中插入和更新数据,而不是在子表上,因为它是查找表。在我的hbm文件
上设置了上述设置时出现以下错误NHibernate.TransientObjectException
对象引用未保存的瞬态实例 - 在刷新或设置级联之前保存瞬态实例 对财产采取行动使其自动保存。
在刷新nhibernate会话时我遇到了上述错误。
答案 0 :(得分:0)
根据评论中的更多信息,还有更多细节
父类:
Language SpokLanguages { get; set; }
Language WrittenLanguages { get; set; }
parent.hbm.xml文件:
<many-to-one name="SpokLanguages" class="Language"
column="SpokenLanguageID" unique="true" cascade="none" />
<many-to-one name="WrittenLanguages" class="Language"
column="WrittenLanguageID" unique="true" cascade="none" />
这就是如何分配财产的方式:
SpokLanguages = new Language() { SpokenLanguageID = 5, };
WrittenLanguages = new Language() { WrittenLanguageID = 6, };
这几乎是正确的,但我们需要的是分配语言ID
parent.SpokLanguages = new Language() { ID = 5, };
parent.WrittenLanguages = new Language() { ID = 6, };
因为此 ID 属性是此处映射的
Paren表中的列将包含语言的ID。映射<many-to-one>
的本质实际上是NHibernate试图将父表中的信息与语言的ID放在一起。在Langauge中映射为id
<class name="Language" ...
<id name="ID"
是我们需要的。如果缺少这个,实体似乎是暂时的。这就是NHibernate指责的原因。
EXTEND:
更合适的解决方案是从DB加载所选语言的实例并分配它们。即使使用一些技巧,Load方法也可以完成。请阅读:
它可能看起来像这样
parent.SpokLanguages = session.Load<Language>(5)
parent.WrittenLanguages = session.Load<Language>(6)