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?

damit Sie wissen, saveOrUpdate() tatsächlich versuchen, das Objekt zu laden von oracle. Nicht sicher, warum funktioniert es nicht mit der Ihnen zugewiesenen id-im Gegensatz zu generierten, aber solange du nicht alles in einer Sitzung, es wird nicht kostet Sie keine extra Zeit.
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

Schreibe einen Kommentar