【问题标题】:NHibernate update on single property updates all properties in sql单个属性上的 NHibernate 更新会更新 sql 中的所有属性
【发布时间】:2009-05-01 20:55:59
【问题描述】:

我正在 NHibernate 中对单个属性执行标准更新。然而,在事务提交时,sql 更新似乎设置了我在表上映射的所有字段,即使它们没有更改。这肯定不是 Nhibernate 中的正常行为吗?难道我做错了什么?谢谢

using (var session = sessionFactory.OpenSession())
           {
               using (var transaction = session.BeginTransaction())
               {
                   var singleMeeting = session.Load<Meeting>(10193);
                   singleMeeting.Subject = "This is a test 2";

                   transaction.Commit();
               }
           }

【问题讨论】:

  • 刚遇到同样的情况。我认为这是一个糟糕的默认设置,我会在适当的论坛中寻找在线讨论。这导致了我正在处理的服务器应用程序中的错误 - 因为它改变了应用程序逻辑,通常在创建对象的并发操作的情况下,然后获取,由另一个线程/进程(不同的会话)获取,修改和更新(更新单独的非相关字段)。上一次更新将覆盖上一次事务中的更改...我已与同事协商过,我们认为性能提升并不大。
  • @YonatanKarni,这不仅关乎性能,还关乎一致性。请参阅此question 及其currently accepted answer

标签: sql nhibernate sql-update


【解决方案1】:

这是正常行为。您可以尝试将dynamic-update="true" 添加到您的类定义中以覆盖此行为。

【讨论】:

    【解决方案2】:

    嗯。是的,这是 NHibernate 的正常行为。您可以为您的属性使用生成的属性来更改行为。 Ayende's blog的详细信息。

    为什么使用此默认值是因为动态不会缓存查询计划。而且通常您不介意通过应用程序服务器和数据库之间的高速网络连接发送更多字节。除非您在此设置完全合适的地方保存长字符串。

    【讨论】:

    • 虽然 Generated 意味着该字段不会通过更新发送进来,但这也意味着该字段是在服务器端处理的。相反,NabilS 正在寻找要发送的那些已更改的字段。
    • 实际上,该博客文章没有提供所需的详细信息,因为它与属性级别有关。 @Darin 的答案是在班级级别,您可以在其中更改此行为。
    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多