Unter [1] habe ich gezeigt, wie man Self-Tracking Entities (STE) mit Code Only relativ einfach realisieren kann. Am Ende dieses Beitrags findet man die hier beschriebenen wiederverwendbaren Klassen (Datei TrackingHelper.cs) und ein Beispiel. Nachfolgend fasse ich zusammen, was zu tun ist, um diesen Ansatz in der Praxis einzusetzen.
- Alle Entitäten implementieren das Interface IEntity, welches (analog zu STE) eine State-Eigenschaft vorgibt.
- Wird die Entität verändert, muss der Status auf Changed gesetzt werden. Dies kann entweder, über eine Property (wie bei STE), über AOP (z. B. PostSharp) oder manuell geschehen.
o Ausnahme: Ist die Entity ist im Zustand New, bleibt sie in diesem im Zustand
(wie bei STE)
- Nach dem Speichern muss bei den Entitäten (wie bei STE) die Methode ResetState(s) aufgerufen werden, damit der Zustand (wieder) auf Unchanged gesetzt wird. Das selbe ist nach dem Laden zu machen.
- Für Relationen ist ein „Fixup“ zu machen, d. h. wenn A auf B verweist, muss auch B auf A verweisen. Auch eventuelle Fremdschlüsselmappings müssen damit korrelieren. Dies kann entweder in den Properties erfolgen (wie bei STE), über AOP oder manuell. Ein Beispiel dafür findet man nachfolgend.
// Beispiel für manuelles "Fix-up"
// h2 ist vom Typ Hotel; r vom Typ Region
h2.Region = r; // Region nach Hotel
h2.RegionId = r.RegionId; // Hotel nach Region
r.Hotels.Add(h2); // Fremdschlüsselmapping
[1] http://www.softwarearchitekt.at/post/2011/08/25/Self-Tracking-Entities-mit-Code-Only-implementieren.aspx
TrackingHelper.cs (1,93 kb)
CodeOnlyWithSTE_Sample.zip (43,21 kb)