2010-01-19 17 views
10

Alle unsere Datenbanktabellen verfügen über UpdateUserID und UpdateTS. Ich hätte gerne diese Einstellung, wenn meine Entität Änderungen hat. Gibt es eine Möglichkeit, dieses Update vor Ort bedingt zu haben?Entity Framework: Aktualisierungszeitstempel festlegen

Wenn ich UpdateTS in Code manuell setze, wird es sagen, dass meine Entität geändert hat und das Objekt immer aktualisieren wird.

Antwort

3

Sie sollten die Saving Ereignis (example here) verarbeiten können und Logik durchführen, wie von @sander

skizzierte
7

Ich nenne diese Erweiterung Methode vor context.SaveChanges() Aufruf:

public static void SetLastModified(this ObjectContext context, DateTime dateTime) 
{ 
    DateTime now = DateTime.UtcNow; 
    foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified)) 
    { 
     if (!entry.IsRelationship) 
     { 
      IHasLastModified lastModified = entry.Entity as IHasLastModified; 
      if (lastModified != null) 
       lastModified.LastModified = now; 
     } 
    } 
} 

ich diesen Code einfach anrufen kann, weil ich Wrapper die Object in einem Repository-Klasse haben. Wenn Sie es blank verwenden, können Sie das Ereignis ObjectContext.SavingChanges anschließen, um etwas Ähnliches zu tun.

+0

Der Versuch, das gleiche zu tun wie hier aufgeführt, aber kämpfen mit IHasLastModified. immer nur einen Nulleintrag in lastModified. Wären Sie in der Lage, den Code, den Sie für diese Schnittstelle haben, zu veröffentlichen, oder informieren Sie, wie Sie Ihre Entitäten davon erben lassen? – Martin

+1

Ich stelle sicher, dass mein Datenobjekt eine 'DateTime' -Eigenschaft namens LastModified hat, und implementiere dann die Schnittstelle in eine partielle Klasse (die Code-Generierung wirft sie also nicht weg). Da die Eigenschaft bereits vorhanden ist, gibt es keinen Code zum Implementieren –

6

Hier ist eine Implementierung der beiden anderen Ideen, mit den folgenden Überlegungen

  • , dass Sie sicherstellen, Erstellen Sie entweder Proxies, die Änderungen automatisch erkennen, oder Sie haben Änderungen vor dem Aufruf von SaveChanges() manuell erkannt. Ist dies nicht der Fall, lautet der Objektstatus EntityState.Unmodified und der letzte geänderte Zeitstempel wird nicht aktualisiert.
  • Ich habe den Code erweitert auch die letzte Änderung Zeitstempel gesetzt, wenn das Objekt erstellt wird (EntityState.Added)

Der Kodex

public interface IHasLastModified 
{ 
    DateTime? LastModified { get; set; } 
} 

public class MyClass : IHasLastModified 
{ 
    public virtual int Id { get; set; } 

    public virtual string SomeOtherProperty { get; set; } 

    public virtual DateTime? LastModified { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public override int SaveChanges() 
    {    
     DateTime now = DateTime.UtcNow; 
     foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)) 
     { 
      if (!entry.IsRelationship) 
      { 
       IHasLastModified lastModified = entry.Entity as IHasLastModified; 
       if (lastModified != null) 
        lastModified.LastModified = now; 
      } 
     } 

     return base.SaveChanges(); 
    } 
+0

Ich verwende eine ähnliche Lösung, aber ich muss in der Lage sein, auch mit proxylosen Entitäten (die durch den obigen Code übersehen werden) umzugehen. Ich schlug eine Änderung der Antwort vor, um dies zu unterstützen, aber es wurde abgelehnt ... – Anders

+1

@Anders: Stellen Sie einfach Ihre eigene Antwort mit der Änderung dann. Sie können auf meine Antwort verweisen und darauf hinweisen, wie Sie mit proxylosen Entitäten umgehen. –