Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF core和ASP.NET core,具有基于模式的多租户_C#_Entity Framework_Dbcontext_Db Schema - Fatal编程技术网

C# EF core和ASP.NET core,具有基于模式的多租户

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

我正在使用ASP.NET核心和EF核心构建和应用程序。我想使用单个数据库实现基于模式的多租户。我的数据库中的每个模式将由相同名称的同一组表组成,因此所有模式共享相同的结构。但是由于我想在我的应用程序中动态创建模式名称,因此模式名称事先不知道

我读过这篇文章,作者介绍了一种使用SQL的方法,但以这种方式修改SQL可能会带来很多问题,例如安全问题或请求失败

如何在DBContext中动态指定要使用的架构(基于接收到的请求),以便从指定的架构保存和检索数据?

Summary: 这可以通过.HasDefaultSchema()和上下文中的一些配置注入来完成

你可以看到一个例子


在那里做了什么: 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

        ...
    }
}