NHibernate如何在IEntity上更新Id

时间:2013-08-08 20:12:12

标签: c# nhibernate

我的数据库中有一行,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'

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我认为你没有一行有这个ID - 但有三行。尝试使用数据库工具并定期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( );