c# - 每当更新派生类时配置基类属性的自动更新 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());
}
}
解决方案
第一:您可能不应该有两个存储库。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();
}
推荐阅读
- javascript - 如何在 Web App Javascript 上检测用户首次登录 Firebase
- c# - xUnit测试asp net core Mapper未初始化
- c# - 组合框背景颜色绑定
- javascript - 为什么 HTML 说我的变量没有定义?
- flutter - AppBar 和 Drawer 布局的最佳实践:重用 vs “复制/粘贴”
- google-apps-script - 我可以在我的 Google 云端硬盘中创建图片列表(包括文件名和共享链接)吗?
- jquery - 在元素上的关键帧动画之后通过jQuery切换不透明度
- git - 如何撤消 repo 并将其转换为常规目录
- python - 如何在本地从 SavedModel 运行推理?
- ruby-on-rails - 使用 Rails 控制台销毁对象不会销毁关联的对象