Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 819
Daniel T. Avatar asked Apr 24 '10 07:04

Daniel T.


2 Answers

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();
like image 169
dotjoe Avatar answered Sep 21 '22 12:09

dotjoe


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

like image 35
Daniel Auger Avatar answered Sep 20 '22 12:09

Daniel Auger