刷新会话时出现Nhibernate异常

时间:2014-04-09 05:44:17

标签: nhibernate

我有父表"父母" with column" SpokenlanguageId"," WrittenlanguageId"。这两列由列#34; languageid"引用。在子表中(两个父表列都由相同的子表列引用)。

在父表hbm文件中,我在父表列(SpokenlanguageId,WrittenlanguageId)中包含多对一关系,其中cascade ="无" 我的方案是仅在父表中插入和更新数据,而不是在子表上,因为它是查找表。在我的hbm文件

上设置了上述设置时出现以下错误

NHibernate.TransientObjectException

对象引用未保存的瞬态实例 - 在刷新或设置级联之前保存瞬态实例 对财产采取行动使其自动保存。

在刷新nhibernate会话时我遇到了上述错误。

1 个答案:

答案 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)