对象引用未保存的瞬态实例在刷新之前保存瞬态实例

时间:2011-07-06 12:22:46

标签: c# nhibernate orm nhibernate-mapping

我有一个自我加入员工实体类,其id,name和ref列与self相关。我想创建它的新实例并将其持久化到db。

首先我创建了一个Employee类的实例,并将其命名为manager。然后我从Employee表中获取了这些值的记录:Id = 1,Name =“A”,RefId = null 并将这些值设置为管理器对象。之后我又创建了一个Employee类的实例 并设置它的属性值如下: emp.Name =“B”,emp.Ref = manager。 最后我通过使用base.Add(resource)方法来坚持它。那时Nhibernate提出了以下错误: “对象引用未保存的瞬态实例,在刷新之前保存瞬态实例”。

这是映射文件内容:

<class name="Employee" table="Employee" schema="dbo" optimistic-lock="none" lazy="true">
    <id name="Id" access="property" column="Id">
        <generator class="identity" />
    </id>
    <property name="Name" type="String" column="Name" length="50" />
    <property name="RefId" type="Int64" column="RefId"  insert="false" update="false"/>
    <many-to-one name="Ref" class="Employee" column="RefId" not-null="false" fetch="select" />
 class>

请帮我解决这个错误。 THX

1 个答案:

答案 0 :(得分:3)

假设实体1是数据库中的现有记录,而实体2是您尝试创建的新记录,其中包含对实体1的引用。

Hibernate告诉您正在保存的新实体(实体2)具有对实体1(数据库中的实体)的引用,并且该实体1具有未保存的更改,必须先保存这些更改才能保存实体2。最简单的方法是首先保存实体1,然后保存实体2.但是,我认为真正的问题是如何获取Entity1的实例。

您说您创建了员工的实例,然后将其命名为manager,然后从employee表中获取记录。如果您尝试从表中更新现有记录,为什么不首先获取实体,然后编辑它?你为什么要实例化一个对象?我不确定的另一件事是物体之间的关系是否是双向的。也就是说,实体1具有FK到实体2,并且实体2具有到实体1的FK。如果是这种情况,则需要确保将“Ref”属性分配两次。 Entityy1.Ref = Entity2 AND ALSO Entity2.Ref = Entity1。