Entity Framework - Auditing-Tätigkeit
Meine Datenbank hat eine "LastModifiedUser' - Spalte auf jeder Tabelle in die ich beabsichtige zu sammeln, die der Benutzer eingeloggt ist, aus einer Anwendung, die eine änderung vornimmt. Ich spreche nicht über den Datenbank-Benutzer im Grunde ist dies also nur ein string auf jede Einheit. Ich möchte einen Weg finden, standardmäßig ist dieser für jede Person, so dass andere Entwickler nicht daran denken müssen, weisen Sie ihm alle Zeit, die Sie instanziieren des Objektes.
So etwas wie dies geschehen würde:
using (EntityContext ctx = new EntityContext())
{
MyEntity foo = new MyEntity();
//Trying to avoid having the following line every time
//a new entity is created/added.
foo.LastModifiedUser = Lookupuser();
ctx.Foos.Addobject(foo);
ctx.SaveChanges();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein perfekter Weg, dies zu erreichen in EF 4.0 durch die NutzungObjectStateManager
Zuerst müssen Sie erstellen eine partielle Klasse, für Ihren ObjectContext und abonnieren
ObjectContext.SavingChanges Veranstaltung. Der beste Ort zum abonnieren dieses event ist innerhalb der OnContextCreated Methode. Diese Methode wird aufgerufen, durch das Kontext-Objekt-Konstruktor und Konstruktor-überladungen, die eine partielle Methode ohne Implementierung:
Nun der eigentliche code, der den job machen:
Code Erklärung:
Dieser code sucht alle Hinzugefügt oder Geändert Einträge, die LastModifiedUser Eigenschaft und aktualisiert dann diese Eigenschaft mit dem Wert aus dem benutzerdefinierten Lookupuser() Methode.
In der foreach-block, die Abfrage im Grunde bohrt sich in die CurrentValues von jedem Eintrag. Dann, mit der Wo Methode, sieht es bei den Namen der einzelnen FieldMetaData Element für den Eintrag, Abholung nur diejenigen, deren Name ist LastModifiedUser. Neben der if-Anweisung überprüft, ob die LastModifiedUser Eigenschaft ist ein String Feld; dann aktualisiert er das Feld Wert.
Ein weiterer Weg, um hook up diese Methode (anstelle der Anmeldung zu SavingChanges Ereignis) wird durch überschreiben der ObjectContext.SaveChanges-Methode.
Übrigens, der obige code gehört zu Julie Lerman von Ihr Programming Entity Framework Buch.
BEARBEITEN für Self-Tracking-POCO Umsetzung:
Wenn Sie self-tracking-POCOs dann, was ich tun würde, ist, dass ich die erste änderung, die die T4-Vorlage aufrufen, um die OnContextCreated () - Methode. Wenn Sie sich Ihre ObjectContext.tt-Datei, es ist ein Initialize() Methode, die aufgerufen wird, die von allen Konstruktoren, daher ein guter Kandidat, rufen Sie unsere OnContextCreated () - Methode, also alles, was wir tun müssen, ist zu ändern ObjectContext.tt-Datei wie folgt:
Und dies wird dazu führen, dass unsere OnContextCreated() aufgerufen werden, bei der Erstellung des Kontext.
Nun, wenn du deine POCOs hinter der Grenze Dienst, dann bedeutet es, dass die ModifiedUserName kommen müssen, mit dem rest der Daten aus den WCF-service-consumer. Sie können entweder setzen diese
LastModifiedUser Eigenschaft, um Sie zu aktualisieren oder, wenn es Filialen in anderen Eigenschaft, und Sie aktualisieren möchten LastModifiedUser aus, dass Eigentum, dann Sie können ändern, der 2. code wie folgt:
Hoffe, das hilft.
if (modifiedField.FieldType != null)
sollte ersetzt werden durchif (modifiedField != null)
Es ist ein nuget-Paket jetzt : https://www.nuget.org/packages/TrackerEnabledDbContext
Github: https://github.com/bilal-fazlani/tracker-enabled-dbcontext