Search code examples
c#.net-coreentity-framework-core

Partial EF Context OnModelCreating Using Scaffold-DbContext


I'm using doing database first development and using Scaffold-DbContext to create my entity models project. In that project, I have a partial dbContext where I override methods like SaveChangesAsync to set certain properties like, "LastModifiedBy".

I'm looking to soft-delete records using dateDeleted/userDeleted columns. When I go to override the OnModelCreating routine, I see that it's already defined on the auto-generated partial context.

I'm trying to do something like the following:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeEntity>().HasQueryFilter(x => x.DateDeleted == null);
}

Does anyone have any suggestion as to how I can do this in a partial class way that still allows me to regenerate the original context on the fly using Scaffold-DbContext?

Also note, I'm using .NET Core 2.1.5

ANSWER FROM David Browne - Microsoft

Add a static property on the partial context

public static bool GlobalFiltersAdded { get; set; } = false;

Then add a routine to add your filters:

private void AddGlobalFilters(ModelBuilder modelBuilder){
    SomeContext.GlobalFiltersAdded = true;
}

Then in your generated context add the following:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    AddGlobalFilters(modelBuilder);
    //OTHER LOGIC WILL BE HERE
}

Solution

  • Options:

    1) Delete the generated OnModelCreating after re-scaffolding. It's already a manual process, and generates a compile error if you forget.

    2) Use a DbContext inherited from the generated DbContext.

    3) Use a 3rd party tool or library like: EF Core Power Tools