【问题标题】:EF7 + ASP.NET5 beta8 - Database initializersEF7 + ASP.NET 5 beta 8 - 数据库初始化器
【发布时间】:2015-10-20 17:06:33
【问题描述】:

我正在开发多租户应用程序 (ASP.NET 5 + EF7)。每个租户都有单独的数据库。我将为租户帐户数据创建一个单独的数据库。我已经在这个单独的数据库的启动类中注册了 EF 服务。我有迁移问题。在将tenantDbContext 注册为具有特定连接字符串的服务之前,我无法创建 EF 迁移。但是这个连接字符串对于每个租户来说必须是动态的......请问有什么想法吗?为租户管理 DbContexts 的最佳选择是什么?

未来的编辑 - protected override void OnConfiguring 是关键怎么做:请问这是一个好的解决方案吗?

 services.AddEntityFramework()
    .AddSqlServer()
    .AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));


services.AddEntityFramework()
     .AddSqlServer()
            .AddDbContext<TenantDbContext>();  




public class TenantDbContext : IdentityDbContext<ApplicationUser>
{
    public TenantDbContext()        //development database with no connectionString in constructor
    {
        this._connectionString = "Connection String";
    }
    public TenantDbContext(string ConnectionString)
    {
        this._connectionString = ConnectionString;
    }

    private string _connectionString { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    { 
        optionsBuilder.UseSqlServer(_connectionString); 
    }  

...等

【问题讨论】:

  • 我最初的想法是不要在启动时连接上下文,而是从工厂获取上下文。类似:ContextFactory.Create(tenant)。对于迁移,您可以使用: Add-Migration MyMigration -ConnectionString "connection string here;" ?
  • 感谢您的回复。必须自动配置新租户 - C#... 想法:我可以在构造函数中使用特定的连接字符串实例化 DbContext 以进行连接。问题是如何在没有迁移的情况下创建数据库(在启动类中注册服务之前我无法创建迁移)我不会使用 SQL 脚本...
  • 也许是第二个想法。是否可以通过数据库初始化程序创建没有迁移的数据库?如果是,未来如何管理数据库变更?

标签: asp.net asp.net-mvc entity-framework


【解决方案1】:

正如我在 cmets 中提到的,我自己没有尝试过多租户/多数据库,但尝试以下方法:

您可以使用 DbContext CreateIfNotExists() 方法。 https://msdn.microsoft.com/en-us/library/system.data.entity.database.createifnotexists(v=vs.113).aspx

如果您有 Migrations/Configuration.cs,您可以将 AutomaticMigrationsEnabled 属性设置为 false

可能还需要关闭初始化程序:Database.SetInitializer&lt;DatabaseContext&gt;(null);

抱歉,不知道创建新租户的工作流程等更多细节(从 DB 自动或用连接字符串和名称等填写的屏幕)我无法提出更详细的建议。我建议您的数据层从上下文中抽象出来。开发人员必须选择正确的上下文似乎是个坏主意。因此使用了工厂。

一个选项总是要求将租户 ID 传递给所有服务或存储库方法。我猜这可能是控制器中可用的某种用户声明。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2016-01-15
  • 2018-09-27
  • 2018-05-16
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多