0

我的数据库中有一行 w/ Id = '00000000-0000-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-0000-000000000000'

4

2 回答 2

5

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

于 2013-08-08T20:14:32.703 回答
2

我认为您没有 1 行具有该 ID,而是 3 行。尝试使用 DB-tool 并做一个常规的select * from [table] where id = '00000000-0000-0000-0000-000000000000'-​​ 我敢打赌那是你的问题。这会产生意想不到的错误 - 并且出于对所有美好事物的热爱 - 对您的 id-column 有一个独特的约束:-)。

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

始终在一个ISession中完成此类工作!

编辑:顺便说一句 - nHibernate 无法更新您的 Id - 这就是 nHibernate 知道您持有哪个对象的方式!你在做什么根本没有意义。如果您确实需要更新该行 - 使用数据库工具并手动执行(并采取措施使其不会再次发生......)

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

于 2013-08-08T20:28:20.153 回答