简体   繁体   中英

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

I have a Store that contains a list of Products :

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

Now, I want to edit one of the Products , but with a transient entity. This will be, for example, data from a web browser:

// 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);

However, trying to do it this way gives me an error:

a different object with the same identifier value was already associated with the session

The reason is because the store.Products collection already contains an entity with the same Id. How do I get around this problem?

Instead of trying to merge the transient instance. Why not start with the actual instance...simply get the product by id, update the fields, and commit.

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

or the merge way...

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

I'm not 100% positive in this case without more context, but a session merge might work.

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

Maybe You should call Database.SaveOrUpdate(store); instead of pure Save(store) ?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM