【问题标题】:How do I update a deserialized entity using NHibernate?如何使用 NHibernate 更新反序列化实体?
【发布时间】:2010-09-15 23:03:42
【问题描述】:

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

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;
}

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

【问题讨论】:

    标签: nhibernate json serialization crud


    【解决方案1】:

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

    顺便说一句,使用 Linq 按 id 选择是浪费:改用session.Get&lt;Product&gt;(id)。

    【讨论】:

    • 迭戈,你一如既往的救命稻草 :)。感谢您的提示,这为我节省了很多代码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2012-08-20
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多