【问题标题】:EF Core: Built in Created and Edited timestamps [duplicate]EF Core:内置创建和编辑的时间戳[重复]
【发布时间】:2017-10-25 08:27:45
【问题描述】:

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

Ruby on Rails 迁移中的 :created_at:updated_at 之类的东西。我找不到任何有关此的文件。如果不存在开箱即用的机制,是否存在如何实现这些列的最佳实践?

【问题讨论】:

  • 另请注意:您需要在Core中public override int SaveChanges(bool acceptAllChangesOnSuccess)
  • @ChristianGollhardt 这不是重复的。另一篇文章不是 EF Core 特定的。许多 EF Core API 完全不同。
  • 答案是:没有。副本是一个可行的替代方案。

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


【解决方案1】:

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

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

    public interface ITimeStampedModel
    {
        DateTime CreatedAt {get; set;}
        DateTime LastModified {get; set;}
    }
    
  2. 在我的 DbContext 上覆盖 SaveChanges 以查找新的或修改过的模型,并适当地更新它们的时间戳:

    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();
    }
    

谁有更好的解决方案?

【讨论】:

  • 我建议寻找一种方法来更新以在数据库中而不是在代码中设置时间。如果对数据库的更新是分批完成的,或者如果查询需要很长时间,则时间将不准确。我想说一个条目的修改日期应该在它进入数据库时​​设置。
  • @S.tenBrinke 当然那会更好,但我找不到任何易于使用和管理的方式来与 EF Core 一起执行此操作。也许他可以使用数据库触发器来完成,但是您需要管理每个表的触发器(似乎不能很好地扩展)。如果您有任何想法,请分享。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2022-08-22
相关资源
最近更新 更多