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

时间:2017-10-25 08:27:45

标签: entity-framework asp.net-core entity-framework-core

标题是不言自明的。是否有内置机制来支持Entity Framework Core中代码优先数据库中记录的Created和Edited时间戳?

Ruby on Rails迁移中的:created_at:updated_at之类的东西。我找不到任何有关此问题的文件。如果没有现成的机制,那么最佳做法是如何实现这些列?

1 个答案:

答案 0 :(得分:1)

非EF Core解决方案在没有大量返工的情况下不适用于EF Core。我想允许某些实体具有CreatedAtLastModified时间戳,它们以合理的自动化方式进行更新。这就是我最后要做的。

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

    public interface TimeStampedModel
    {
        DateTime CreatedAt {get; set;}
        DateTime LastModified {get; set;}
    }
    
  2. 在我的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();
    }
    

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