概括:
这可以通过 .HasDefaultSchema() 和您的上下文中的一些配置注入来完成。
您可以在 GitHub.com 上查看示例。
那里做了什么:
1)我们将架构添加到app.settings:
"Database": {
"Schema": "test"
},
2)模式的附加模型和提供者:
数据库设置.cs
public class DatabaseSettings
{
public string Schema { get; set; }
}
SchemaProvider.cs
public class SchemaProvider : ISchemaProvider
{
private DatabaseSettings Settings { get; }
public SchemaProvider(IOptions<DatabaseSettings> settings)
{
this.Settings = settings.Value;
}
public string GetSchema()
{
return this.Settings.Schema;
}
}
3)在Startup.cs
我们为模式名称注册新的配置模型和提供者:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<DatabaseSettings>(this.Configuration.GetSection("Database"));
services.Add(new ServiceDescriptor(typeof(ISchemaProvider), typeof(SchemaProvider), ServiceLifetime.Scoped));
var connection = this.Configuration.GetConnectionString("TestDatabase");
services.AddDbContext<TestContext>(options => options.UseSqlServer(connection));
services.AddControllers();
}
4)在TestContext(EF Core Context)中,我们添加模式提供者的注入并应用选定的模式:
public partial class TestContext : DbContext
{
private ISchemaProvider SchemaProvider { get; }
...
public TestContext(DbContextOptions<TestContext> options, ISchemaProvider schemaProvider)
: base(options)
{
this.SchemaProvider = schemaProvider;
}
...
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(this.SchemaProvider?.GetSchema() ?? "dbo"); // null value supported for migrations from EF Core CLI without application context
...
}
}
什么没有做?
这纯粹是 PoC,因此不能用作生产就绪代码,需要大量测试/分析。
这没有针对 app.settings 即时更改和自定义配置加载进行测试,可能存在不同的问题。
手动修复迁移以使用自定义架构。可能支持自动迁移到运行时选择的模式,请参阅此链接,但我从未尝试过。