2009-07-31 2 views
2

Sagen wir, ich will eine Klasse erstellen, genannt EntityWithCreatedAt implementieren:Wie CreatedAt Immobilie mit Schloss Active

class Entity<T> : ActiveRecordBase<T> 
{ 
    [PrimaryKey] 
    public int Id { get; set; } 
} 

class EntityWithCreatedAt<T> : Entity<T> 
{ 
    [Property] 
    public DateTime CreatedAt { get; set; } 
} 

Was ist der beste Weg, um bevölkern das CreatedAt Feld? Tue ich es einfach in Konstruktoren von EntityWithCreatedAt oder gibt es eine andere Möglichkeit?

Was ist mit einer Eigenschaft "UpdatedAt"?

Danke,

Antwort

2

In Rails' Implementierung von AR, CreatedAt und UpdatedAt sind automatische Zeitstempel in Migrationen erstellt (obwohl man sie manuell erstellt wurden, können auch). Angenommen, Sie möchten dasselbe Verhalten, müssen Sie Create und Update überschreiben.

public override void Update() 
    { 
     UpdatedAt = DateTime.Now;      
     base.Update(); 
    } 

    public override void Create() 
    { 
     CreatedAt = DateTime.Now; 
     base.Create(); 
    } 

Wenn Sie einen zugewiesenen Primärschlüssel nicht verwenden, und die DB es für Sie generiert (mit Autoinkrement, zum Beispiel), dann können Sie die Save-Methode verwenden, ob Erstellen oder anrufen, um zu entscheiden Aktualisieren. Die Verwendung von Speichern funktioniert immer noch perfekt für Sie, da ein Aufruf der Save() - Methode der Basisklasse einen Aufruf an Ihre Create (wenn die ID nicht gesetzt wurde) oder Ihr Update (wenn die ID gesetzt wurde und der Datensatz wurde zuvor gespeichert).

Der einzige Nachteil dieser Methode ist, dass Ihre CreatedAt und UpdatedAt Eigenschaften sollte immer überlegen, was in der DB gespeichert ist, aber in Ihrem Fall sind Setzen Sie die Eigenschaften vor Sie die commit wissen die DB gelungen. Dies ist unvermeidlich, aber mit etwas Versuch/Fang-Code in Ihrem Update Override, sollten Sie in der Lage sein, den vorherigen Wert aufzuzeichnen und es zurück zuweisen, wenn etwas schief gehen sollte: