C# 对象引用未保存的临时实例在刷新前保存临时实例

C# 对象引用未保存的临时实例在刷新前保存临时实例,c#,nhibernate,orm,nhibernate-mapping,C#,Nhibernate,Orm,Nhibernate Mapping,我有一个self-join-employees实体类,它的id、name和ref列与其自身相关。我想创建它的新实例并将其持久化到db 首先,我创建了Employee类的一个实例,并将其命名为manager。然后我从Employee表中获取了一条记录,其中包含以下值:Id=1,Name=“a”,RefId=null 并将这些值设置为管理器对象。之后,我再次创建了Employee类的实例 并将其属性值设置为: emp.Name=“B”,emp.Ref=经理。 最后,我使用base.Add(resou

我有一个self-join-employees实体类,它的id、name和ref列与其自身相关。我想创建它的新实例并将其持久化到db

首先,我创建了Employee类的一个实例,并将其命名为manager。然后我从Employee表中获取了一条记录,其中包含以下值:Id=1,Name=“a”,RefId=null 并将这些值设置为管理器对象。之后,我再次创建了Employee类的实例
并将其属性值设置为: emp.Name=“B”,emp.Ref=经理。 最后,我使用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是数据库中的现有记录,实体2是您尝试创建的引用实体1的新记录

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


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

请澄清,您的意思是有一个对象是自引用的,还是有两个员工对象,它们之间有引用?也就是说,是否有两个员工记录,它们之间有外键,或者一个员工记录的外键指向主键。此外,拥有员工实体的映射文件或代码也会很有帮助。谢谢您的建议。我会尽量弄清楚的。我编辑了我的问题。有两个员工记录,它们之间有外键。我不想删除数据库中现有记录的edti Entity1。但我必须获取它,以便将其分配给Entity2的RefId属性,该属性具有Employee类型。同时,Entity2有一个FK引用Entity1作为其管理器,但Entity1的RefId属性中有一个空值。我的目标是将这些记录保存到表中:在refId列中有空值的经理和在refId列中有managerId值的员工。更简单!如果只需要创建从Entity2到Entity1的引用,那么实际上甚至不需要获取记录。如果知道Entity1的id值,可以使用Entity2.Ref=Session.Load(idValue)。这将为您提供参考资料。我刚刚注意到一些我应该早点抓到的东西。您需要删除RefId属性。这是进行参考所需的全部内容。在那里使用RefId是多余的,可能会给您带来一些问题。您的权利。有两个指纹和财产让我陷入了麻烦。但我更喜欢从refid中剪切insert=“false”update=“false”,并在Properties中跳过它,这就解决了我的问题。谢谢你的建议。祝你好运