gpt4 book ai didi

c# - 如何使用 CaSTLe ActiveRecord 实现 CreatedAt 属性

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:03 25 4
gpt4 key购买 nike

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

谢谢,

最佳答案

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

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

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

如果您没有使用分配的主键,而数据库正在为您生成主键(例如,使用自动递增),那么您可能正在使用 Save 方法来决定是调用 Create 还是 Update。使用 Save 仍然对您非常有用,因为调用基类的 Save() 方法将触发对您的 Create(如果尚未设置 ID)或 Update(如果已设置 ID 并且记录之前已保存)。

此方法的唯一缺点是您的 CreatedAt 和 UpdatedAt 属性应始终反射(reflect)数据库中保存的内容,但在您的情况下,您设置属性之前您知道提交到数据库成功了。这是不可避免的,但是在更新覆盖中使用一些 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;
}
}

关于c# - 如何使用 CaSTLe ActiveRecord 实现 CreatedAt 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1215356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com