如何使用NHibernate更新反序列化的实体?

时间:2010-09-15 23:03:42

标签: nhibernate json serialization crud

假设我有一个像这样的实体:

public class Product
{
    public virtual int Id { get; set; }
    public virtual int Name { get; set; }
}

客户端想要更新特定产品的名称,因此他将此JSON发送回ASP.NET服务器:

{
    "Id": 1,
    "Name": "Updated Product Name"
}

然后我运行此代码尝试保存它:

var jsonString = GetJsonStringFromRequestBody();
var product = JsonNet.Deserialize<Product>(jsonString);

using (var session = SessionFactory.OpenSession())
{
    session.Update(product);
}

不幸的是,我得到以下异常:

  

NHibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确)

现在,我可以使用以下代码:

var jsonString = GetJsonStringFromRequestBody();
var productToUpdate = JsonNet.Deserialize<Product>(jsonString);

using (var session = SessionFactory.OpenSession())
{
    var productFromDB = session.Linq<Product>().Single(x => x.Id == productToUpdate.Id);
    productFromDB.Name = productToUpdate.Name;
}

但不幸的是,这需要手动将每个属性从反序列化实体复制到持久化实体。有更简单或更好的方法吗?

1 个答案:

答案 0 :(得分:1)

从数据库中检索并更新是最安全的方法。如果要编写更少的代码,可以使用反射。

顺便说一句,使用Linq按id进行选择是一种浪费:改为使用session.Get<Product>(id)