2009-04-09 8 views
3

Ich habe einen Anruf, der feststellen muss, ob ein Feld geändert wurde. Der Aufruf von get mit dieser Entitäts-ID gibt jedoch dieselbe Entität zurück, nicht die vorherige Version.Ermitteln, ob ein Entitätenfeld in NHibernate geändert wurde

Entity e = Dao.Get(id); 
//At this point e.Field is X 
e.Field = y; 
Dao.Save(e); 

Entity Dao.Get(Guid id) 
{ 
    return Session.Get(id); 
} 

Entity Dao.Save(Entity e) 
{ 
    Entity olde = Session.Get(e.Id); 
    if (e.Field != olde.Field) <--- e.Field == olde.Field so it does not run. 
    DoBigMethod(e); 
    return e; 
} 

Wie gehe ich mit dieser Situation ohne Hinzufügen einer OnChange-Methode zur Entity-Klasse.

Antwort

1

Sie kennen nur eine "Version" der Entität: die aktuelle. Dort ist tatsächlich nur eine Version der Entität. Sie haben es im Speicher und Sie haben es bereits geändert und den vorherigen Zustand vergessen.

Anruf erhalten, um zu sehen, der vorherige Datenbankzustand ist gefährlich. Wenn Änderungen bereits geleert werden (NHibernate wird vor Abfragen z. B. geleert), erhalten Sie Ihre Änderungen. Wenn Sie eine andere Sitzung öffnen, sehen Sie Änderungen von anderen Transaktionen.

Sind Sie nur an einem einzelnen Feld interessiert? Dann können Sie den alten Wert irgendwo zwischenspeichern.

Wenn dies nicht funktioniert, müssen Sie mir mehr über den Grund erzählen, warum Sie den vorherigen Wert dieses Feldes kennen müssen.

EDIT:

Einige weitere Ideen:

  • Cache der vorherige Zustand des Feldes, wenn Sie das Objekt zu erhalten, in DAO.Get
  • diese Eigenschaft implementieren, dass sie eine Flagge, wenn es setzt geändert.
  • berücksichtigen, dass diese Änderung eine vom Client aufgerufene explizite Operation anstelle einer impliziten Operation wird, die aufgerufen wird, wenn sich die Flag ändert. Wenn dieses Flag beispielsweise "Aktiviert" heißt, implementieren Sie eine "Aktivieren" - und "Deaktivieren" -Methode. Diese Methode ändert dieses Flag und führt den "großen Code" aus. Die Flagge ist für den Rest der Welt schreibgeschützt.
+0

Wir haben eine Flagge auf einem Benutzer, dass, wenn es ändert, läuft eine große Reihe von Code. Dieser Code löst in bestimmten Fällen Ausnahmen aus. Ich muss diese Überprüfung nicht durchführen, wenn sie nur andere Felder aktualisieren. Ausnahmen wären in diesen Fällen unwahrscheinlich. – Thad

+0

Ich habe meiner Antwort einige Ideen hinzugefügt. Ich hoffe es hilft. –

Verwandte Themen