Ich arbeite an einem NHibernate-Projekt und habe eine Frage bezüglich der Aktualisierung von transienten Entitäten.NHibernate - bestimmte Eigenschaften als 'dirty' kennzeichnen
Grundsätzlich ist der Arbeitsablauf ist wie folgt:
- einen DTO Erstellen (Vorsprung) und den Draht an den Client senden über. Dies hat eine kleine Teilmenge von Eigenschaften von der Entität.
- Client sendet den geänderten DTO zurück
- Ordnen Sie die DTO-Eigenschaften wieder der entsprechenden Entität zu, damit eine UPDATE-Anweisung generiert und von NH ausgeführt werden kann.
- speichern das Unternehmen
Punkt 4 ist, wo ich das Problem. Derzeit kann ich dieses Update mit der Methode session.Merge() erreichen, allerdings muss es zuerst die Entity vor dem Update von der db laden (keine 2LC annehmen). Daher werden sowohl eine Auswahl- als auch eine Aktualisierungsanweisung ausgelöst.
Was ich tun möchte, ist eine transiente Instanz der Entität zu erstellen, die neuen Werte aus dem DTO abzubilden, dann NH generieren eine SQL-Anweisung nur mit den Eigenschaften, die ich geändert habe. Die zusätzliche Auswahl sollte nicht notwendig sein, da ich bereits die Entitäts-ID und die für die SET-Klausel erforderlichen Werte habe. Ist das in NH möglich?
Momentan mit session.Update() werden alle Eigenschaften in die update-Anweisung aufgenommen und eine Ausnahme wird aufgrund der nicht initialisierten Eigenschaften ausgelöst, die nicht Teil des DTO sind.
Im Wesentlichen brauche ich einen Weg, um anzugeben, welche Entity-Eigenschaften schmutzig sind, so dass nur diese im Update enthalten sind.
== == EDIT
Zum Beispiel ...
public class Person
{
public virtual int PersonId { get; set; }
public virtual string Firstname { get; set; }
public virtual string Nickname { get; set; }
public virtual string Surname { get; set; }
public virtual DateTime BirthDate { get; set; }
}
Und der Testfall.
// Create the transient entity
Person p = new Person()
p.id = 1;
using (ISession session = factory.OpenSession())
{
session.Update(p);
// Update the entity – now attached to session
p.Firstname = “Bob”;
session.Flush();
}
Ich hatte gehofft, eine SQL-Anweisung ähnlich zu ‚UPDATE Personen SET Vorname =‚Bob‘WHERE PersonID = 1‘ zu erzeugen. Stattdessen erhalte ich eine DateTime out of range-Ausnahme, da BirthDate nicht initialisiert wird. Es sollte nicht BirthDate benötigen, da es für die SQL-Anweisung nicht benötigt wird. Vielleicht ist das nicht möglich?
==/EDIT ==
Vielen Dank im Voraus, John
Es gibt auch Auswirkungen auf die Leistung dieser auch mit Ich glaube, dass die Verwendung von statischen Updates (insgesamt) leistungsfähiger ist, da nhibernate die update-Anweisungen vorbereitet, wenn die sessionfactory erstellt wird. – DanP
Hallo James, Danke für die Antwort. Ich habe das DynamicUpdate (fließendes Mapping) für die Entität festgelegt. Vielleicht wird ein Beispiel das Problem verdeutlichen. Bitte beachten Sie den obigen Abschnitt. – John
Ich muss zustimmen, dass die API in diesem Fall nicht intuitiv ist;) Ich habe mit Session.Lock() in meiner "Real-World" -App getestet und es gibt genau das SQL zurück, das ich möchte. Vielen Dank für Ihre Hilfe mit diesem James. – John