NHibernate如何在IEntity上更新Id

本文关键字:更新 Id IEntity NHibernate | 更新日期: 2023-09-27 18:27:07

我的数据库中有一行w/Id="00000000-0000-0000-000000000000",

如何使用会话/事务强制更新此Id,基本上为行分配一个有效的Id。

我试过:

var testrow  = repo.get(id);
testrow.Id = Guid.NewGuid();
repo.UpdateRow(testRow);

我的更新存储库更新方法:

public void UpdateRow(TestRow row)
        {
            using (ISession session = _sessionFactory.OpenSession())
            using (ITransaction transaction = session.BeginTransaction())
            {
                session.Update(row);
                transaction.Commit();
            }
        }

我得到错误:

"Row was updated or deleted by another transaction"

如果我尝试使用删除对象

session.delete(row) 
transaction.Commit();

我得到以下错误:

Unexpected row count: 3; expected: 1

共有3行,每行都有一个唯一的Id,其中一行恰好有一个错误的Id 00000000-0000-0000-000000000000'

NHibernate如何在IEntity上更新Id

id永远不能更改,这是应用程序设计中的错误。删除旧实体并使用新值重新创建。

我认为您没有一行具有该id,而是有三行。试着使用DB工具并执行常规的select * from [table] where id = '00000000-0000-0000-0000-000000000000'——我敢打赌这就是你的问题。这将导致意外的错误——出于对所有好处的热爱——对您的id列有一个独特的约束:-)。

此外,您的更新方法违反了ISession的工作单元模式。你在一个会话中加载对象,更新它,然后尝试在另一个会话进行更新,这势必会给你带来意想不到的结果!

总是在一个I会话中进行这种工作!

编辑:顺便说一句,nHibernate无法更新你的Id,这就是nHibernat知道你拿着哪个物体的原因!你在做什么根本没有意义。如果你真的需要更新那一行-使用DB工具手动完成(并采取措施使其不会再次发生…)

EDIT2:若要更正此问题,请在代码中使用:nHibernate支持原始sql-使用ISession.CreateSQLQuery("DELETE FROM[table]WHERE Id='000000000-0000-0000-000000000000'").ExecuteUpdate();