运行 在不覆盖 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);
});
我正在使用 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);
});