c# - 每当更新派生类时配置基类属性的自动更新 EF Core 2.0

标签 c# .net entity-framework

我有一个名为 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; }
}

每当 EntityBase 的任何一个派生类更新时,如何使用 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());   
    }
}

最佳答案

首先:您可能不应该拥有两个存储库。 EF 已经是具有 UoW 的通用存储库,称为 DbContext。了解更多信息 here .

如果您可以等到 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();
}

关于c# - 每当更新派生类时配置基类属性的自动更新 EF Core 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51737528/

相关文章:

c# - TeamCity:GhostscriptSharp:尝试加载格式不正确的程序。 (HRESULT 异常:0x8007000B)

c# - LINQ - 单运算符(operator)

c# - ArgumentOutOfRangeException(应用偏移量时表示的 UTC 时间必须介于 0 年和 10,000 年之间。)与 OData/SC Orchestrator

.net - 在不使用 Select Case 语句的情况下,如何在表单状态更改时处理启用/禁用工具条按钮?

c# - 如何在我的具体情况下实现 IEnumerable?

c# - 需要一个好的表单对接组件

c# - 使用 linq 将字符串连接到实体

c# - LINQ to EF、Left Join 和 group by 子句

c# - 如何调用 DbContext 线程安全

c# - 从 Controller 运行种子方法