如何使用Castle ActiveRecord实现CreatedAt属性

时间:2009-07-31 23:28:16

标签: c# castle-activerecord

假设我想创建一个名为EntityWithCreatedAt的类:

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

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

填充CreatedAt字段的最佳方法是什么?我只是在EntityWithCreatedAt的构造函数中执行此操作,还是有其他方法?

UpdatedAt属性怎么样?

谢谢,

1 个答案:

答案 0 :(得分:2)

在Rails的AR实现中,CreatedAt和UpdatedAt是在迁移中创建的自动时间戳(尽管您也可以手动创建它们)。假设您需要相同的行为,则需要覆盖创建和更新。

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

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

如果您没有使用指定的主键,并且DB正在为您生成(例如,使用自动增量),那么您可能正在使用Save方法来决定是调用Create还是Update。使用Save仍然可以完美地为您工作,因为对基类'Save()方法的调用将触发对Create的调用(如果尚未设置ID)或您的Update(如果已设置ID并且记录以前已保存过。)

此方法的唯一缺点是您的CreatedAt和UpdatedAt属性应始终反映数据库中保存的内容,但在您的情况下,您在之前设置属性,您知道对数据库的提交成功了。这是不可避免的,但是在Update覆盖中有一些try / catch代码,你应该能够记录以前的值并在出现任何问题时将其分配回来:

   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;
         }
   }