关于.net:只更新填写的属性

Only updating filled in properties

有没有办法让 NHibernate 只更新没有填写默认值的字段?假设我们有这个简单的类:

1
2
3
4
5
6
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

我们还有一个标准的 NHibernate 映射,它使用每个字段的属性和 Id 字段的 Id。

假设我们希望页面只更新名称,因此我们发送 ID,将其存储在隐藏字段中,并显示名称的文本框。用户修改名称并点击保存。我们 POST 回来,新建一个 Person 对象,并分配传入的 Id 和 Name。然后我们告诉 NHibernate 更新数据库。

问题是,Age 显然在数据库中被设置回 0,因为它没有从 POST 中返回。最明显的解决方法是将 Age 值发送到页面,将其存储在隐藏字段中,然后在保存之前将其填回。直到您在对象上获得更多属性并且只想在屏幕上修改充满它们的手(或大量 Person 对象列表,这可能需要在隐藏字段中存储大量值)之前,这都可以正常工作。

所以回到问题的主题:有没有办法告诉 NHibernate 基本上忽略 Age 属性,因为它在更新之前会有一个默认值 (0),或者我是否坚持了一吨隐藏字段以保留现有值?


在回帖中,使用 Id 从存储库中检索持久化实体,并仅更新名称并将其持久化。这样,您无需维护隐藏字段中的值。


这听起来有点可疑。通常,当您编辑 Hibernate 实体时,您首先从数据库中加载它,对其进行更改,然后将其保存回数据库。您通常不会创建一个新对象,设置其 ID 和任何任意属性,然后保存新对象,因为正如您所说,任何未设置的属性很可能会设置为默认值。

通过从数据库中加载它,所有属性都被正确填写,因此您不必担心自己维护这些状态。 Hibernate 会话负责维护这些对象的状态,直到您将它们保存并刷新到数据库中。

处理跨网络请求的hibernate会话有不同的策略。查看这篇文章:http://hibernatebp.blogspot.com/ - 查看会话管理策略。"带有分离对象的每个请求的会话"在您的情况下可能很好。