C# 级联还是不级联?(“对象引用未保存的临时实例”错误)

C# 级联还是不级联?(“对象引用未保存的临时实例”错误),c#,nhibernate,orm,nhibernate-mapping,many-to-many,C#,Nhibernate,Orm,Nhibernate Mapping,Many To Many,首先,我昨天试着问了类似的问题(),但经过一个晚上的调试,我希望我能用更好的方式(对吗?)重新表述一个问题。如果我犯了什么错误,请告诉我,我会把帖子删除 下面是一个真实问题的描述: 给定USER,ROLE和USER\u ROLE表,分别保存用户、角色和多对多单向关系。目前,用户有一包角色,仅此而已: 用户: <class name="User" lazy="false" table="Users"> <id name="Id" type="int">

首先,我昨天试着问了类似的问题(),但经过一个晚上的调试,我希望我能用更好的方式(对吗?)重新表述一个问题。如果我犯了什么错误,请告诉我,我会把帖子删除

下面是一个真实问题的描述:

给定
USER
ROLE
USER\u 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>
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);
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)
);
用户表

  <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>
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);
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)
);
用户角色表

  <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>
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);
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)
);
获取用户时(我正在跟踪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
问题来了:当我试图保存用户,然后深入调试器时,NHibernate检查角色对象的最新更新值,并抛出NHibernate.TransientObject异常(对象引用未保存的临时实例-刷新前保存临时实例),告诉我需要先保存角色。尽管如此,该角色仍然没有修改

我曾尝试在用户上应用“保存更新”和“全部”以及其他类型的级联(获取时没有更改),但在保存用户时,它尝试先保存角色,我得到一个异常,即违反了角色唯一性约束

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

更新:意外地以以下方式修改了
角色
映射(添加了
未保存值=“未定义”
):



这些问题似乎没有问题这是正确的/最佳的解决方案吗?

因此,长话短说(感谢)版本字段
最新更新的
应该初始化为
1
,而不是
0
。然后,这一切在一个可爱的交响乐中协调


令人难以置信的是,在一个位中可以携带如此多的差异:)

因此,为了使长话短说(并感谢)版本字段
LastUpdated
应该初始化为
1
,而不是
0
。然后,这一切在一个可爱的交响乐中协调


令人难以置信的是,一个位子能带来多大的差异:)

告诉我们您是如何添加新角色的?这就是您在保存用户时所尝试的,对吗?此外,我没有看到角色的LastUpdated属性。您是否在用户的角色列表包上尝试了
cascade=“all delete orphan”
?上面的SQL是我获取用户时使用的。修复了上次更新的属性(它在源代码中)。我并没有同时添加一个新角色——只是通过UserId获取、更新用户描述并尝试保存用户。cascade=“all delete orphan”-尝试了它,得到了相同的约束冲突。刚刚用某种解决方案/解决方法更新了问题-不知道它有多合适。向我们展示您如何添加新角色?这就是您在保存用户时所尝试的,对吗?此外,我没有看到角色的LastUpdated属性。您是否在用户的角色列表包上尝试了
cascade=“all delete orphan”
?上面的SQL是我获取用户时使用的。修复了上次更新的属性(它在源代码中)。我并没有同时添加一个新角色——只是通过UserId获取、更新用户描述并尝试保存用户。cascade=“all delete orphan”-尝试了它,得到了相同的约束冲突。只是用某种解决方案/解决方法更新了问题-不知道它有多合适。