我正在使用数据库优先开发并使用 Scaffold-DbContext 创建我的实体模型项目。在该项目中,我有一个部分 dbContext,我在其中重写 SaveChangesAsync 等方法来设置某些属性,例如“LastModifiedBy”。
我正在寻找使用 dateDeleted/userDeleted 列来软删除记录。当我去重写 OnModelCreating 例程时,我看到它已经在自动生成的部分上下文中定义。
我正在尝试做以下事情:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SomeEntity>().HasQueryFilter(x => x.DateDeleted == null);
}
有没有人对我如何以部分类方式执行此操作有任何建议,同时仍然允许我使用 Scaffold-DbContext 即时重新生成原始上下文?
另请注意,我正在使用 .NET Core 2.1.5
来自 David Browne 的回答 - Microsoft
在部分上下文上添加静态属性
public static bool GlobalFiltersAdded { get; set; } = false;
然后添加一个例程来添加过滤器:
private void AddGlobalFilters(ModelBuilder modelBuilder){
SomeContext.GlobalFiltersAdded = true;
}
然后在生成的上下文中添加以下内容:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
AddGlobalFilters(modelBuilder);
//OTHER LOGIC WILL BE HERE
}
选项:
1)重新搭建后删除生成的OnModelCreating。这已经是一个手动过程,如果您忘记,则会生成编译错误。
2)使用从生成的DbContext继承的DbContext。
3) 使用第三方工具或库,例如:EF Core Power Tools
值得一提 - 我认为现在有更好的方法来做到这一点,如果您能够升级到 EF 8+。
支架的上下文类现在在方法的底部有一个“OnModelCreatingPartial”调用,可以在部分类中覆盖它,绕过 David Browne 的答案中提到的内容。
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);