gpt4 book ai didi

c# - 对象引用未保存的 transient 实例 在刷新之前保存 transient 实例

转载 作者:行者123 更新时间:2023-11-30 12:15:50 27 4
gpt4 key购买 nike

我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。

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

这是映射文件内容:

<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>

请帮我解决这个错误。谢谢

最佳答案

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

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

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

关于c# - 对象引用未保存的 transient 实例 在刷新之前保存 transient 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6596289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com