首页 > 解决方案 > 每当更新派生类时配置基类属性的自动更新 EF Core 2.0

问题描述

我有一个名为 EntityBase 的基类,用于该项目中建模的每个实体。该基类使用存储库模式对这些实体执行操作,如下所示。

public class Repository : IRepository
{
    private readonly EfCoreContext _dbContext;

    public Repository(EfCoreContext dbContext)
    {
        _dbContext = dbContext;
    }


    public IQueryable<T> All<T>() where T : EntityBase
        => _dbContext.Set<T>().AsQueryable();

    public IEnumerable<T> Filter<T>(Expression<Func<T, bool>> predicate) where T : EntityBase
        => Filter<T>(predicate).AsQueryable<T>();

    ...
    ...

    public T Add<T>(T entity) where T : EntityBase
    {
        _dbContext.Set<T>().Add(entity);
        _dbContext.SaveChanges();

        return entity;
    }
}

这是基类

public abstract class EntityBase
{
    public EntityBase()
    {
        this.CreatedOn = DateTime.Now;
        this.UpdatedOn = DateTime.Now;
        this.CreatedBy = "DC";
        this.UpdatedBy = "DC";
    }

    public string CreatedBy { get; set; }
    public string UpdatedBy { get; set; }

    public DateTime CreatedOn { get; set; }
    public DateTime UpdatedOn { get; set; }

    public int ID { get; set; }
}

每当它的任何一个派生类更新时,如何使用 Fluent API 或数据注释自动捕获 EntityBase 的 UpdatedOn 和 UpdatedBy 属性?

这是我的 DbContext

public class EfCoreContext : DbContext
{
    public EfCoreContext(                             
        DbContextOptions<EfCoreContext> options)      
        : base(options) {}

    public DbSet<Book> Books { get; set; }
    public DbSet<Author> Authors { get; set; }
    public DbSet<Order> Orders { get; set; }

    protected override void
        OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new BookConfig());       
        modelBuilder.ApplyConfiguration(new BookAuthorConfig());
        modelBuilder.ApplyConfiguration(new OrderConfig());
        modelBuilder.ApplyConfiguration(new LineItemConfig());   
    }
}

标签: c#.netentity-framework

解决方案


第一:您可能不应该有两个存储库。EF 已经是具有称为 DbContext 的 UoW 的通用存储库。在此处阅读更多相关信息。

如果您可以一直等到SaveChanges被调用,则可以覆盖 DbContext 的SaveChanges方法:

public override int SaveChanges()
{
    var entries = ChangeTracker.Entries().Where(x => x.Entity is EntityBase && (x.State == EntityState.Added || x.State == EntityState.Modified));
    foreach (var entry in entries)
    {
        var entity = (EntityBase)entry.Entity;
        //do something
    }
    return base.SaveChanges();
}

推荐阅读