2010-09-15 62 views
0

比方說,我有一個實體,像這樣:如何使用NHibernate更新反序列化的實體?

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

從數據庫中檢索並更新是最安全的方法。如果你想寫更少的代碼,你可以使用反射。

順便說一下,使用Linq按ID選擇是一種浪費:使用session.Get<Product>(id)來代替。

+0

迭戈,你是一個像往常一樣的救星:)。並感謝提示,這節省了我相當多的代碼! – 2010-09-16 19:34:37

+0

不客氣:--D – 2010-09-16 21:13:11

相關問題