EF Core:内置的创建和编辑时间戳

lss*_*lss 7 entity-framework entity-framework-core asp.net-core

标题是不言自明的。是否存在内置机制来支持Entity Framework Core中代码优先数据库中记录的创建和编辑时间戳记?

喜欢的东西:created_at,并:updated_at在Ruby on Rails的迁移。我找不到与此有关的任何文档。如果没有现成的机制,是否有最佳实践来实现这些列?

mat*_*ich 4

如果不进行一些返工,非 EF Core 解决方案不适用于 EF Core。我希望允许某些实体拥有以相当自动化的方式更新的时间戳CreatedAtLastModified这就是我最终所做的。

  1. 定义了一个接口 -ITimeStampedModel我的模型可以继承该接口,要求它们具有我想要的时间戳:

    public interface ITimeStampedModel
    {
        DateTime CreatedAt {get; set;}
        DateTime LastModified {get; set;}
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 覆盖SaveChangesmyDbContext以查找新的或修改的模型,并适当更新它们的时间戳:

    public override int SaveChanges()
    {
        var newEntities = this.ChangeTracker.Entries()
            .Where(
                x => x.State == EntityState.Added &&
                x.Entity != null &&
                x.Entity as ITimeStampedModel != null
                )
            .Select(x => x.Entity as ITimeStampedModel);
    
        var modifiedEntities = this.ChangeTracker.Entries() 
            .Where(
                x => x.State == EntityState.Modified &&
                x.Entity != null &&
                x.Entity as ITimeStampedModel != null
                )
            .Select(x => x.Entity as ITimeStampedModel);
    
        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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

有人有更好的解决方案吗?