如何使用NHibernate更新记录的一列

时间:2017-05-24 08:54:08

标签: c# asp.net asp.net-mvc nhibernate

我想只更新数据库中记录的一列。不是整个记录,而只是一列(Stav)。我正在使用NHibernate,我通过DAO访问。

Rezervace_dao rezervaceDao = new Rezervace_dao();
r.Stav = 1;
rezervaceDao.Update(r);

上面的代码更新了整个记录,但这不是我想要的。

非常感谢你。

2 个答案:

答案 0 :(得分:3)

在您的示例代码中,您在实体上调用Update。这用于更新分离的实体,当前NHibernate会话未跟踪的实体。

更新分离的实体时,告诉NHibernate采用提供的实体并将其视为完整的新状态,以便在数据库中更新它。因此,您未设置的所有属性都将具有其默认值,NHibernate将认为必须使用这些默认值更新数据库。

如果您只想更改一个属性,则必须首先使用NHibernate加载它,更改属性,然后Flush会话。

var r = session.Load<Rezervace>(id);
r.Stav = 1;
session.Flush();

当从当前会话加载实体时,没有必要告诉NHibernate您正在更新哪个实体。

默认情况下,NHibernate仍会使用之前的值更新所有属性,并使用新值更新已更改的属性。正如Rabban answer所述,您必须在类映射上启用dynamic-update以更改此行为,并让NHibernate仅更新已更改的属性。

备注:

我现在认为我应该没有回答,但是:

  • 标记关闭的问题,不清楚或重复(现在不清楚)。
  • 指出现有问题中当前可能的答案。 (完成this comment。)
    如果我们处于独立的情况,This answer对其中一个问题的解决方法比我的好。

答案 1 :(得分:1)

您必须在映射中将Dynamic-Update设置为true。但是你必须为你想要这种行为的每个类设置它。

请注意:对于Dynamic-Insert

的插入,也可以实现同样的效果

NHibernate Reference州:

  

dynamic-update (可选,默认为false):指定应在运行时生成UPDATE SQL,并且仅包含值已更改的列。

来自NHibernate参考(缩短)的一个例子:

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Eg"
namespace="Eg">
    <class name="Cat" table="CATS" dynamic-update="true">
            <id name="Id" column="uid" type="Int64">
                    <generator class="hilo"/>
            </id>
            <property name="BirthDate" type="Date"/>
            // other properties
    </class>
</hibernate-mapping>

讨论了缺点here