2009-07-31 4 views
2

Dire que je veux créer une classe appelée EntityWithCreatedAt:Comment mettre en œuvre CreatedAt Propriété avec Castle ActiveRecord

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

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

Quelle est la meilleure façon de remplir le champ CreatedAt? Est-ce que je le fais dans les constructeurs de EntityWithCreatedAt, ou y a-t-il un autre moyen?

Qu'en est-il d'une propriété UpdatedAt?

Merci,

Répondre

2

Dans la mise en œuvre de Rails AR, CreatedAt et UpdatedAt sont horodatages automatiques créés dans les migrations (bien que vous pouvez les créer manuellement, aussi). En supposant que vous voulez le même comportement, vous devrez remplacer Créer et Mettre à jour.

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

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

Si vous n'êtes pas à l'aide d'une clé primaire assignée, et la DB génère pour vous (avec incrémentation automatique, par exemple), vous pouvez utiliser la méthode Save pour décider d'appeler Créer ou Mettre à jour. L'utilisation de Save fonctionnera parfaitement pour vous, car un appel à la méthode Save() de la classe de base déclenchera un appel à votre Create (si l'ID n'a pas été défini) ou à votre Update (si l'ID a été défini et enregistrement a déjà été enregistré). Le seul inconvénient de cette méthode est que vos propriétés CreatedAt et UpdatedAt doivent toujours refléter ce qui est enregistré dans la base de données, mais dans votre cas vous définissez les propriétés avant vous savez que la validation de la base de données a réussi. Ceci est inévitable, mais avec un certain code try/catch dans votre override de mise à jour, vous devriez pouvoir enregistrer la valeur précédente et l'assigner en cas de problème:

public override void Update() 
    { 
     DateTime originalUpdatedAt = UpdatedAt; 
     try 
     { 
      UpdatedAt = DateTime.UtcNow; // Assuming you're using UTC timestamps (which I'd recommend)      
      base.Update(); 
     } 
     catch // Don't worry, you're rethrowing so nothing will get swallowed here. 
     { 
      UpdatedAt = originalUpdatedAt; 
      throw; 
     } 
    } 
Questions connexes