假设我想创建一个名为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属性怎么样?
谢谢,
答案 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;
}
}