Wie Speichere ich ein transientes Objekt, das bereits existiert, in einer NHibernate-session?
Ich habe eine Store
enthält eine Liste von 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);
Nun, ich Bearbeiten möchten Sie eine der Products
, aber mit einer vorübergehenden Person. Diese werden zum Beispiel Daten von einem 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);
Allerdings versucht, es zu tun auf diese Weise gibt mir eine Fehlermeldung:
ein anderes Objekt mit der gleichen id-Wert war bereits im Zusammenhang mit der Sitzung
Der Grund ist, weil die store.Products
Sammlung enthält bereits ein Element mit derselben Id. Wie kann ich dieses problem umgehen?
- Haben Sie versucht, die Sitzung.Entfernen(Produkt) vor dem speichern das zweite mal?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt zu versuchen, verschmelzen die transiente Instanz. Warum nicht beginnen Sie mit der eigentlichen Instanz...einfach die Produkt-id, die Felder aktualisieren und zu Begehen.
oder der merge-Weg...
Bin ich mir nicht 100% positiv in diesem Fall, ohne mehr Kontext, aber eine Sitzung Zusammenführen könnte.
http://ayende.com/Blog/archive/2009/11/08/nhibernate-ndash-cross-session-operations.aspx
Sollten Sie vielleicht rufen Sie Datenbank.SaveOrUpdate(store); statt der reinen Speichern(store) ?
Database.Save()
hatNHibernate.ISession.SaveOrUpdate()
hinter die kulissen.