6

Mam Store który zawiera listę Products:Jak zapisać obiekt przejściowy, który już istnieje w sesji 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); 

Teraz chcę zmienić jedną z Products, ale z nieustalonych podmiotu. Będzie to na przykład dane z poziomu przeglądarki internetowej:

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

Jednak starając się zrobić to w ten sposób daje mi błąd:

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

Powodem jest fakt, że zbiór store.Products zawiera już podmiot o tym samym identyfikatorze. Jak obejść ten problem?

+0

Czy próbowałeś session.Evict (produktu) przed zapisaniem po raz drugi? – mxmissile

Odpowiedz

8

Zamiast próbować połączyć przemijające instancji. Dlaczego nie zacząć od rzeczywistej instancji ... po prostu pobierz produkt według identyfikatora, zaktualizuj pola i zatwierdz.

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

lub sposób scalania ...

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

Może powinieneś zadzwonić do Database.SaveOrUpdate (store); zamiast czystego Zapisz (zapisz)?

+0

Ups, zapomniałem wspomnieć, że 'Database.Save()' robi 'NHibernate.ISession.SaveOrUpdate()' za kulisami. –

+0

SaveOrUpdate nie pomoże w tej sytuacji, błąd występuje, ponieważ w sesji istnieje już obiekt. – jfneis

Powiązane problemy