6

J'ai un Store qui contient une liste de Products:Comment enregistrer un objet transitoire existant dans une session 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); 

Maintenant, je veux modifier un des Products, mais avec une entité transitoire. Ce sera, par exemple, les données à partir d'un navigateur 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); 

Cependant, en essayant de le faire de cette façon me donne une erreur:

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

La raison est que la collection store.Products contient déjà un entité avec le même Id. Comment contourner ce problème?

+0

Avez-vous essayé session.Evict (produit) avant d'enregistrer la deuxième fois? – mxmissile

Répondre

8

Au lieu d'essayer de fusionner l'instance transitoire. Pourquoi ne pas commencer par l'instance actuelle ... il suffit d'obtenir le produit par identifiant, de mettre à jour les champs et de valider.

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

ou la façon de fusion ...

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

Peut-être que vous devriez appeler Database.SaveOrUpdate (store); au lieu de sauver (magasin) pur?

+0

Oups, j'ai oublié de mentionner que 'Database.Save()' fait 'NHibernate.ISession.SaveOrUpdate()' dans les coulisses. –

+0

SaveOrUpdate ne va pas aider dans cette situation, l'erreur se produit car il y a déjà un objet en session. – jfneis

Questions connexes