运行 在不覆盖 Entity Framework 核心中的自定义代码的情况下搭建 DBContext

Run Scaffold DBContext without overwriting custom code in Entity Framework core

我正在使用 EF Core 和数据库优先方法。我使用 Scaffold-DbContext 生成我的 DBContext 和实体 class,它给了我预期的结果,但是当我再次使用 运行 Scaffold-DbContext 命令时 -Force,它会覆盖我的数据库上下文文件

我正在使用多租户,并且我在 DBContext 文件中有自定义代码(新构造函数,OnConfiguring 方法中的连接字符串)

如何在不覆盖 DBContext 文件的情况下更新我的模型?

    public partial class MyContext : DbContext
    {
        private readonly ITenantDatabaseProvider _tenantProvider;

        public MyContext()
        {
        }

        public MyContext(DbContextOptions<MyContext> options)
            : base(options)
        {
        }
        public MyContext(ITenantDatabaseProvider tenantProvider)
        {
            _tenantProvider = tenantProvider;
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer(_tenantProvider.GetTenantConnectionString().Result);
                //.AddInterceptors(new HintCommandInterceptor());
            }

            base.OnConfiguring(optionsBuilder);
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
        }
        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
        
    }

虽然其他答案告诉我们使用不同的构造函数,但它没有解释如何以及为什么。

将数据库上下文与租户的概念分开会更清晰,您唯一需要从租户那里获得的是连接字符串?好吧,你可以通过选项传递它。

public MyContext(DbContextOptions<MyContext> options)
    : base(options)
{
}

为保持相同的逻辑,为每个数据库上下文实例使用动态构建选项

services.AddDbContext<ApplicationCoreDbContext>((services, builder) =>
{
    var tenantProvider = services.GetRequiredService<ITenantDatabaseProvider>();
    builder.UseSqlServer(tenantProvider.GetTenantConnectionString().Result);
});