簡體   English   中英

如何保存NHibernate會話中已存在的瞬態對象?

[英]How do I save a transient object that already exists in an NHibernate session?

我有一個包含Products列表的Store

var store = new Store();
store.Products.Add(new Product{ Id = 1, Name = "Apples" };
store.Products.Add(new Product{ Id = 2, Name = "Oranges" };

Database.Save(store);

現在,我想編輯其中一個Products ,但是要使用瞬態實體。 例如,這將是來自Web瀏覽器的數據:

// this is what I get from the web browser, this product should
// edit the one that's already in the database that has the same Id
var product = new Product{ Id = 2, Name = "Mandarin Oranges" };

store.Products.Add(product);
Database.Save(store);

但是,嘗試這樣做會給我一個錯誤:

具有相同標識符值的不同對象已與會話關聯

原因是因為store.Products集合已經包含具有相同Id的實體。 我該如何解決這個問題?

而不是嘗試合並瞬態實例。 為什么不從實際實例開始...只需通過id獲取產品,更新字段並提交。

var product = session.Get<Product>(2);
product.Name = "Mandarin Oranges";
tx.Commit();

或合並方式......

var product = new Product{ Id = 2, Name = "Mandarin Oranges" };
var mergedProduct = (Product) session.Merge(product);
tx.Commit();

在沒有更多上下文的情況下,我不是100%肯定,但會話合並可能有效。

http://ayende.com/Blog/archive/2009/11/08/nhibernate-ndash-cross-session-operations.aspx

也許你應該調用Database.SaveOrUpdate(store); 而不是純粹的保存(商店)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM