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'
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();