标题是不言自明的。是否有内置机制来支持Entity Framework Core中代码优先数据库中记录的Created和Edited时间戳?
Ruby on Rails迁移中的:created_at
和:updated_at
之类的东西。我找不到任何有关此问题的文件。如果没有现成的机制,那么最佳做法是如何实现这些列?
答案 0 :(得分:1)
非EF Core解决方案在没有大量返工的情况下不适用于EF Core。我想允许某些实体具有CreatedAt
和LastModified
时间戳,它们以合理的自动化方式进行更新。这就是我最后要做的。
定义了一个接口-TimeStampedModel
,我的模型可以从该接口继承而来,要求它们具有我想要的时间戳:
public interface TimeStampedModel
{
DateTime CreatedAt {get; set;}
DateTime LastModified {get; set;}
}
在我的SaveChanges
上覆盖DbContext
,以查找新模型或修改过的模型,并适当地更新其时间戳:
public override int SaveChanges()
{
var newEntities = this.ChangeTracker.Entries()
.Where(
x => x.State == EntityState.Added &&
x.Entity != null &&
x.Entity as TimeStampedModel != null
)
.Select(x => x.Entity as TimeStampedModel);
var modifiedEntities = this.ChangeTracker.Entries()
.Where(
x => x.State == EntityState.Modified &&
x.Entity != null &&
x.Entity as TimeStampedModel != null
)
.Select(x => x.Entity as TimeStampedModel);
foreach (var newEntity in newEntities)
{
newEntity.CreatedAt = DateTime.UtcNow;
newEntity.LastModified = DateTime.UtcNow;
}
foreach (var modifiedEntity in modifiedEntities)
{
modifiedEntity.LastModified = DateTime.UtcNow;
}
return base.SaveChanges();
}
有人有更好的解决方案吗?