Question

Dites que je veux créer une classe appelée EntityWithCreatedAt:

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

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

Quel est le meilleur moyen de renseigner le champ CreatedAt? Est-ce que je le fais simplement dans les constructeurs d'EntityWithCreatedAt, ou existe-t-il un autre moyen?

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

Merci,

Était-ce utile?

La solution

Dans l'implémentation de AR par Rails, CreatedAt et UpdatedAt sont des horodatages automatiques créés dans les migrations (bien que vous puissiez les créer manuellement également). En supposant que vous souhaitiez le même comportement, vous devrez remplacer Création et mise à jour.

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

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

Si vous n'utilisez pas de clé primaire affectée et que la base de données la génère pour vous (avec incrémentation automatique, par exemple), vous utilisez peut-être la méthode Save pour décider s'il convient d'appeler Create ou Update. L’utilisation de Save fonctionnera toujours parfaitement, car l’appel à la méthode Save () de la classe de base déclenchera un appel de votre création (si l’ID n’a pas été défini) ou de votre mise à jour (si l’ID a été défini et si le l’enregistrement a déjà été sauvegardé).

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 que dans votre cas, vous définissez les propriétés avant , vous connaissez la validation de la base de données. réussi. Ceci est inévitable, mais avec un code try / catch dans votre remplacement de mise à jour, vous devriez pouvoir enregistrer la valeur précédente et la réaffecter 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;
         }
   }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top