6

Tengo un Store que contiene una lista de Products:¿Cómo guardo un objeto transitorio que ya existe en una sesión de NHibernate?

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

Ahora, quiero editar una de las Products, pero con una entidad transitoria. Esta será, por ejemplo, los datos de un navegador 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); 

Sin embargo, tratando de hacerlo de esta manera me da un error:

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

La razón es porque la colección store.Products ya contiene una entidad con el mismo Id. ¿Cómo puedo solucionar este problema?

+0

¿Ha intentado session.Evict (producto) antes de guardar el segundo tiempo? – mxmissile

Respuesta

8

lugar de tratar de fusionar la instancia transitoria. ¿Por qué no comenzar con la instancia real ... simplemente obtener el producto por identificación, actualizar los campos y confirmar.

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

o la forma de combinación ...

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

Tal vez deberías llamar a Database.SaveOrUpdate (store); en lugar de puro Guardar (tienda)?

+0

Vaya, se olvidó de mencionar que 'Database.Save()' hace 'NHibernate.ISession.SaveOrUpdate()' detrás de las escenas. –

+0

SaveOrUpdate no ayudará en esta situación, el error ocurre porque ya hay un objeto en sesión. – jfneis

Cuestiones relacionadas