Wie kann ich das Einfügen oder Aktualisieren (oder überschreiben) einer Aufnahme mit NHibernate?
Muss ich schreiben, eine Zeile in die Datenbank, unabhängig davon, ob es bereits existiert oder nicht. Vor der Verwendung von NHibernate dies wurde mit einer gespeicherten Prozedur. Das Verfahren würde versuchen, ein update und wenn keine Zeilen geändert wurden, würde es den fallback auf einen Einsatz. Dies funktionierte gut, weil die Anwendung nicht egal, wenn der Datensatz vorhanden ist.
Mit NHibernate, die Lösungen, die ich gefunden habe, erfordern das laden der Einheit und ändern Sie es, oder löschen der Entität, damit die neue eingefügt werden können. Die Anwendung nicht zu kümmern, wenn der Datensatz bereits vorhanden ist. Gibt es eine Möglichkeit das umgehen?
Spielt die Id eine Rolle?
Zugewiesene Id
Das Objekt hat einen Suchbegriff als eine id zugewiesen und ist der Primärschlüssel in der Tabelle.
Ich verstehe, dass SaveOrUpdate() ruft die Save() oder Update () - Methode als angemessen, basierend auf der Id. Über eine zugewiesene id, das wird nicht funktionieren, weil die id nicht als eine nicht gespeicherte Wert. Aber eine Version oder Timestamp-Feld kann verwendet werden als ein Indikator statt. In der Realität ist dies nicht relevant, denn dies spiegelt nur nach, ob das Objekt im Speicher wurde im Zusammenhang mit einem Datensatz in der Datenbank, es zeigt nicht an, wenn der Datensatz vorhanden ist oder nicht in der Datenbank.
Generierte Id
Wenn die zugewiesene id, die waren wirklich die Ursache des Problems, könnte ich eine generierte id anstelle des Schlüsselworts als Primärschlüssel. Dies würde vermeiden, dass die NHibernate Insert - /Update-Problem, wie wäre es effektiv immer einfügen. Allerdings brauche ich noch um zu verhindern, dass doppelte keywords. Mit einem eindeutigen index auf die keyword-Spalte wird es noch eine Ausnahme für eine doppelte Schlüsselwort, selbst wenn der primäre Schlüssel ist anders.
Anderen Ansatz?
Vielleicht das problem ist nicht wirklich mit NHibernate, aber die Art, wie diese modelliert wird. Im Gegensatz zu anderen Bereichen der Anwendung ist dieser mehr datenorientierte eher Objekt-orientierter. Es ist schön, dass NHibernate macht es leicht zu Lesen/schreiben und beseitigt die gespeicherten Prozeduren. Aber der Wunsch, einfach nur zu schreiben ohne Rücksicht auf bestehende Werte, die nicht passen gut mit dem Modell der ein Objekt-Identitäts-Modell. Gibt es einen besseren Weg, um diesen Ansatz?
Wenn das Objekt nicht in der Datenbank vorhanden sind, bekam ich eine Fehlermeldung, dass es konnte nicht aktualisieren Sie das Objekt. Eine Google-Suche zeigte Verweise auf die Tatsache, dass SaveOrUpdate() funktioniert nicht mit einer zugewiesenen id.
Ich habe aktualisiert die Frage zu erklären, das problem im detail und meine bessere Verständnis von NHibernate
InformationsquelleAutor g . | 2008-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mit
aber FindByExample Methode gibt alle Objekte gleichermaßen keine Objekte mit der genauen ID, was schlagen Sie vor ? da ich nur Objekt als parameter die ich nicht haben Zugriff auf seine spezifische ID-Feld, so kann ich nicht verwenden
session.get(Object.class(), id);
Nevermind : Es war in der Verwendung von NHibernate.Kriterium; namespace.
mit NHibernate; mit NHibernate.Kriterium;
InformationsquelleAutor ShDev
In der Regel, NHibernate, können sich auf die unerlösten-Wert, um zu bestimmen, ob es einfügen soll oder die Entität erstellen. Jedoch, da Sie bei der Zuordnung der ID zu NHibernate es sieht aus wie Ihre entity bereits persistiert. Daher müssen Sie verlassen sich auf die Versionsverwaltung Ihr Objekt zu lassen, NHibernate wissen, dass es ein neues Objekt. Finden Sie unter dem folgenden link für Sie, wie Ihre version von entity:
http://web.archive.org/web/20090831032934/http://devlicio.us/blogs/mike_nichols/archive/2008/07/29/when-flushing-goes-bad-assigned-ids-in-nhibernate.aspx
href="http://web.archive.org/web/20090831032934/http://devlicio.us/blogs/mike_nichols/archive/2008/07/29/when-flushing-goes-bad-assigned-ids-in-nhibernate.aspx" >web.archive.org/web/20090831032934/http://devlicio.us/blogs/...
Gut gefunden!!! Nun, wenn nur ich könnte mich erinnern, was ich Tat, vor drei Jahren, das interessiert mich... ; -), würde ich raten, es zu Bearbeiten, link in die Antwort auch, obwohl (oder ich kann).
ha ha... ich nehme an, Sie warten schon die ganze Zeit für den link, offenbart zu werden, und jetzt, dass Sie es haben können Sie auf-und abschließen dieser Aufgabe 🙂 ich getan habe, um das zu Bearbeiten, obwohl Sie haben werde, um "peer-reviewed" wirksam werden.
InformationsquelleAutor pondermatic
Verwenden Sie die Sitzung.SaveOrUpdate(object) - Methode.
Ja, es kann. Siehe auch den Kommentar auf meine Antwort.
Es kann verwendet werden, mit einer id zugewiesen, wenn das Objekt verfügt über eine Version oder Timestamp-Feld. Das löst nicht das problem sein.
InformationsquelleAutor gcores
Können Sie tun
Wenn ich das Objekt trotzdem, ich kann Sie nur löschen, wenn es existiert. Ich hatte gehofft, um zu vermeiden, dass, obwohl.
warum sollte man es löschen, wenn es existiert? Warum nicht einfach überschreiben? Merge ist im Ruhezustand, ich weiß nicht, über NHibernate. Und auf einer bestimmten Ebene, die Sie haben zu prüfen, ob das Objekt vorhanden ist, entweder über die hibernate-API oder manuell.
SaveOrUpdate() kann nicht verwendet werden, wenn die Person hat eine zugewiesene id.
Tatsächlich kann. Das ist genau der Zweck der saveOrUpdate(). save() kann nicht verwendet werden, wenn Sie eine zugewiesene id, update() darf nicht verwendet werden ohne eine, und saveOrUpdate() umgeht das Problem.
InformationsquelleAutor Elie
Query-Objekten, in denen keyword = x, nehmen FirstOrDefault. Wenn es null ist, Hinzufügen neues Objekt, wenn er vorhanden ist -, update-Objekt, das Sie haben, und rufen Sie saveOrUpdate.
InformationsquelleAutor WholeLifeLearner
rufen Sie überwintern.saveOrUpdate (), die prüft, ob das Objekt in der Datenbank aktualisieren, wenn es ist, und speichern (d.h. insert) wenn es nicht ist.
Ganz richtig, aber die Quintessenz ist, lassen Sie Ruhezustand zu bestimmen, welche der zwei Methoden zu nennen. Aus dem Blickwinkel der Implementierung, das ist nur Semantik.
Dies ist ein wichtiger Punkt. Wenn die Sitzung fällt aus dem Rahmen, dann werden Sie wahrscheinlich bekommen ein Fehler....duplizieren des primary-key wie die häufigsten.
Diese Antwort ist genau falsch
InformationsquelleAutor Elie