【问题标题】:NHibernate Partial UpdateNHibernate 部分更新
【发布时间】:2009-08-17 00:28:36
【问题描述】:

在 NHibernate 中有没有办法从非代理模型开始

var m = new Model() { ID = 1 };
m.Name = "test";
//Model also has .LastName and .Age

现在保存这个模型只更新名称而不先从会话中选择模型?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    如果模型除了名称还有其他属性,你需要用数据库中的原始值初始化这些,除非它们被设置为空。

    您可以使用HQL update operations;我自己从未尝试过。

    您也可以使用本机 SQL 语句。 ("Update model set name ...")。

    通常不需要这种优化。在极少数情况下您需要避免选择数据,因此编写此 SQL 语句只是浪费时间。您正在使用 ORM,这意味着:编写面向对象的软件!除非你不会从中获得太多好处。

    【讨论】:

      【解决方案2】:

      Stefan 所说的看起来就像您需要的一样。请注意,这确实是一个边缘案例,除非您遇到一些超高性能问题,否则您应该对完全加载您的实体感到满意。

      如果您只是不想访问数据库 - 尝试使用缓存 - 实体缓存非常简单高效。

      如果您的实体是一个巨大的实体 - 即它包含一个 blob 或其他东西 - 考虑将其分成两部分(多对一,以便您可以利用延迟加载)。

      【讨论】:

        【解决方案3】:

        http://www.hibernate.org/hib_docs/nhibernate/html/mapping.html

        动态更新(可选,默认为 false):指定 UPDATE SQL 应该在运行时生成,并且 仅包含那些列 值已更改。

        对 HBM 中的类进行动态更新。

        var m = new Model() { ID = 1 };
        m = session.Update(m); //attach m to the session.
        m.Name = "test";
        session.Save(m);
        

        【讨论】:

        • 我现在不确定 .Update 是否命中数据库,我也不想要它。
        • 试试看。最有可能的是,更新不会立即命中数据库。它只是将模型放入会话并将其标记为脏,无论如何它都会被存储。
        • 动态更新在这种情况下不起作用,因为 NH 没有原始值并且不知道发生了什么变化。看到这个问题:stackoverflow.com/questions/1243390/…
        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多