【问题标题】:NHibernate How to update Id on IEntityNHibernate 如何在 IEntity 上更新 Id
【发布时间】:2013-08-09 04:46:09
【问题描述】:

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

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

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

    【讨论】:

    • 这是唯一的选择吗?如果我尝试通过代码 session.delete(row) 删除它,我会收到错误:Unexpected row count: 3;预计:1
    • 根据定义和 id 永远不会改变。 id 必须是唯一且不可变的。验证您的数据库中没有重复的对象。
    • 所有 Id 都是唯一的,其中一个恰好是 00000000-0000-0000-0000-000000000000,这是导致问题的原因。
    【解决方案2】:

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

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

    总是在one ISession 中进行这种工作!

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

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

    【讨论】:

    • 它确实对 Id 有唯一约束,有 3 行但只有 00000000-0000-0000-0000-000000000000' 的行。
    • 嗯...可能是 nHibernate 抛出一个奇怪的错误,因为您正在尝试做一些事情,这与 nHibernate 的整个想法背道而驰...我仍然会使用 DB-tool 来修复它 - 我接受它,它不应该发生,对吧?
    • 不,不是,NHibernate 有时很挑剔
    • 您有一个已保存的实体,在 nHibernate 中看起来未保存(即 '00000000-0000-0000-0000-000000000000' id)——当这种情况发生时,龙已经开始了......
    • nHibernate 支持原始 sql - 使用 ISession.CreateSQLQuery("DELETE FROM [table] WHERE Id = '00000000-0000-0000-0000-000000000000'").ExecuteUpdate();
    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多