C# EF core和ASP.NET core,具有基于模式的多租户
我正在使用ASP.NET核心和EF核心构建和应用程序。我想使用单个数据库实现基于模式的多租户。我的数据库中的每个模式将由相同名称的同一组表组成,因此所有模式共享相同的结构。但是由于我想在我的应用程序中动态创建模式名称,因此模式名称事先不知道 我读过这篇文章,作者介绍了一种使用SQL的方法,但以这种方式修改SQL可能会带来很多问题,例如安全问题或请求失败 如何在DBContext中动态指定要使用的架构(基于接收到的请求),以便从指定的架构保存和检索数据?Summary: 这可以通过.HasDefaultSchema()和上下文中的一些配置注入来完成 你可以看到一个例子C# EF core和ASP.NET core,具有基于模式的多租户,c#,entity-framework,dbcontext,db-schema,C#,Entity Framework,Dbcontext,Db Schema,我正在使用ASP.NET核心和EF核心构建和应用程序。我想使用单个数据库实现基于模式的多租户。我的数据库中的每个模式将由相同名称的同一组表组成,因此所有模式共享相同的结构。但是由于我想在我的应用程序中动态创建模式名称,因此模式名称事先不知道 我读过这篇文章,作者介绍了一种使用SQL的方法,但以这种方式修改SQL可能会带来很多问题,例如安全问题或请求失败 如何在DBContext中动态指定要使用的架构(基于接收到的请求),以便从指定的架构保存和检索数据?Summary: 这可以通过.HasDefa
在那里做了什么: 1) 我们将架构添加到app.settings:
"Database": {
"Schema": "test"
},
2) 架构的其他模型和提供程序:
DatabaseSettings.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;
}
}
4) 在TestContext(EF核心上下文)中,我们添加了模式提供者的注入,并应用所选模式:
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
...
}
}
公共部分类TestContext:DbContext
{
私有ISchemaProvider SchemaProvider{get;}
...
公共TestContext(DbContextOptions选项,ISchemaProvider schemaProvider)
:基本(选项)
{
this.SchemaProvider=SchemaProvider;
}
...
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.HasDefaultSchema(this.SchemaProvider?.GetSchema()??“dbo”);//不带应用程序上下文的EF Core CLI迁移支持空值
...
}
}
还有什么没有做?
- 这纯粹是PoC,因此不能用作生产就绪代码,需要大量测试/评测
- 未针对应用程序进行测试。动态更改设置和自定义配置加载,可能存在不同的问题
- 手动修复迁移以使用自定义架构。也许这可以支持自动迁移到运行时选择的模式,请参阅,但我从未尝试过
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
...
}
}