gpt4 book ai didi

c# - 级联还是不级联? ("object references an unsaved transient instance"错误)

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:02 26 4
gpt4 key购买 nike

首先,我昨天尝试问过类似的问题 ( NHibernate many-to-many relationship question: can select, can't update ),但经过一个晚上的调试后,希望我能以更好(对吗?)的方式重新表述问题。如果我做错了什么 - 请告诉 - 我会删除帖子。

下面是描述,然后是一个真正的问题:

给定 USERROLEUSER_ROLE 表,其中保留用户角色和多对多单向关系。目前,用户 有一组角色,仅此而已:

用户:

  <class name="User" lazy="false" table="Users">
<id name="Id" type="int">
<generator class="native"/>
</id>
<version name="m_lastChanged" access="field" column="LastChanged" generated="never" type="int"/>

<property name="Name" />

<bag name="RoleList" table="User_Role" lazy="false" collection-type="Roles">
<key column="UserId" foreign-key="Id"/>
<many-to-many class="Role" column="RoleId"/>
</bag>

</class>

角色(目前角色非常少):

  <class name="Role" lazy="false" table="Roles">
<id name="Id" type="int">
<generator class="native"/>
</id>
<version name="m_lastChanged" access="field" column="LastChanged" generated="never" type="int"/>

<property name="Name" />
<property name="Description" />
</class>

角色表:

CREATE TABLE [Roles] (
[Id] INTEGER NOT NULL PRIMARY KEY,
[Name] text NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0)
);

CREATE UNIQUE INDEX uidxUserName ON Roles (Name COLLATE NOCASE);

用户表:

CREATE TABLE [Users] (
[Id] INTEGER NOT NULL PRIMARY KEY,
[Name] text NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0)
);

CREATE UNIQUE INDEX uidxRoleName ON Users (Name COLLATE NOCASE);

USER_ROLE 表:

CREATE TABLE [User_Role] (
[UserId] INTEGER NOT NULL,
[RoleId] INTEGER NOT NULL,
[LastChanged] INT NOT NULL DEFAULT(0),
PRIMARY KEY (UserId, RoleId),
FOREIGN KEY (UserId) REFERENCES Users(Id),
FOREIGN KEY (RoleId) REFERENCES Roles(Id)
);

User 被获取时(我正在跟踪 SQL 查询)——它的关系和角色也被获取:

SELECT
rolelist0_.UserId as UserId1_,
rolelist0_.RoleId as RoleId1_,
role1_.Id as Id2_0_,
role1_.LastChanged as LastChan2_2_0_,
role1_.Name as Name2_0_,
role1_.Description as Descript4_2_0_
FROM
User_Role rolelist0_
left outer join
Roles role1_
on rolelist0_.RoleId=role1_.Id
WHERE
rolelist0_.UserId=@p0;
@p0 = 2

SELECT
user0_.Id as Id3_0_,
user0_.LastChanged as LastChan2_3_0_,
user0_.Name as Name3_0_,
user0_.Password as Password3_0_,
user0_.FullName as FullName3_0_,
user0_.EMail as EMail3_0_,
user0_.PhoneNumber as PhoneNum7_3_0_,
user0_.Description as Descript8_3_0_
FROM
Users user0_
WHERE
user0_.Id=@p0;
@p0 = 2

问题来了:当我尝试保存 User 时,NHibernate 在调试器的深处检查 ​​LastUpdated 值 < em>Role 对象并抛出 NHibernate.TransientObjectException(对象引用未保存的 transient 实例 - 在刷新前保存 transient 实例),告诉我需要先保存角色。虽然该角色仍未修改。

我尝试在用户上应用“save-update”“all”以及其他类型的级联(没有变化在获取时),但在保存 User 时,它首先尝试保存 Role 并且我得到一个异常,即违反了角色唯一性约束。

那么,如果合适的话,你能指出我在这里遗漏了什么吗?

更新:不小心按以下方式修改了Role映射(添加了unsaved-value="undefined"):

<version name="m_lastChanged" access="field" column="LastChanged" unsaved-value="undefined" generated="never" type="int"/>

查询似乎没问题。 这是正确/最佳的解决方案吗

最佳答案

因此,长话短说(感谢 Ayende)版本字段 LastUpdated 应该初始化为 1,而不是 0。然后,这一切都交织成一首可爱的交响乐。

令人难以置信的是,一个位可以承载多少差异:)

关于c# - 级联还是不级联? ("object references an unsaved transient instance"错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3266014/

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