假设我有一个像这样的实体:
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;
}
但不幸的是,这需要手动将每个属性从反序列化实体复制到持久化实体。有更简单或更好的方法吗?
答案 0 :(得分:1)
从数据库中检索并更新是最安全的方法。如果要编写更少的代码,可以使用反射。
顺便说一句,使用Linq按id进行选择是一种浪费:改为使用session.Get<Product>(id)
。