仅更新填充的属性

时间:2009-05-06 20:15:56

标签: .net nhibernate

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

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),或者我坚持一公吨隐藏要保留现有值的字段吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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