我想只更新数据库中记录的一列。不是整个记录,而只是一列(Stav)。我正在使用NHibernate,我通过DAO访问。
Rezervace_dao rezervaceDao = new Rezervace_dao();
r.Stav = 1;
rezervaceDao.Update(r);
上面的代码更新了整个记录,但这不是我想要的。
非常感谢你。
答案 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仅更新已更改的属性。
备注:强>
我现在认为我应该没有回答,但是:
答案 1 :(得分:1)
您必须在映射中将Dynamic-Update
设置为true
。但是你必须为你想要这种行为的每个类设置它。
请注意:对于Dynamic-Insert
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。