2015-10-20 50 views
2

我正在开发多租户应用程序(ASP.NET 5 + EF7)。每个租户都有独立的数据库。我将为租户帐户数据提供一个单独的数据库。我在这个单独的数据库的启动类中注册了EF的服务。我遇到了迁移问题。我不能创建EF迁移,直到tenantDbContext被注册为具有特定连接字符串的服务。但是这个连接字符串必须对每个租户都是动态的...请有任何想法吗?管理租户的DbContexts的最佳选择是什么?EF7 + ASP.NET5 beta8 - 数据库初始值设定项

未来的编辑 - 保护覆盖无效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); 
    } 

...等

+0

我最初的想法不是在启动时连接上下文,而是从工厂获取上下文。例如:'ContextFactory.Create(tenant)'。对于您可以使用的迁移:Add-Migration MyMigration -ConnectionString“此连接字符串;” ? –

+0

感谢您的回复。提供新租户必须自动化 - C#... IDEA:我可以在连接的构造函数中使用特定的连接字符串实例化DbContext。问题是如何在没有迁移的情况下创建数据库(我不能在启动类中注册服务之前创建迁移)我不会使用SQL脚本... –

+0

也许是第二个想法。可以通过数据库初始化程序创建数据库而无需迁移?如果是,将来如何管理数据库更改? –

回答

2

正如我在评论中提到我还没有尝试过的多租户/多分贝自己,但尝试以下方法:

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

如果你有一个迁移/ Configuration.cs可以AutomaticMigrationsEnabled属性设置为false

设置初始化断大概需要以及:Database.SetInitializer<DatabaseContext>(null);

对不起不知道像创建一个工作流程的详细信息新租户(自动从数据库或填写连接字符串和名称等屏幕)我不能提出更详细的建议。我建议你的数据层从上下文中抽象出来。开发人员不得不选择正确的上下文似乎是一个坏主意。因此使用工厂。

的选项始终要求租户ID将被传递到所有的服务或资料库的方法。我猜这将会出现在控制器中的某种用户声明中。

+0

谢谢你的回答。好主意..我现在有可能构建tenantDbContext。我在这里创建了EF7数据库初始化工具:[https://github.com/aspnet/EntityFramework/wiki/Entity-Framework-Design-Meeting-Notes---May-29,-2014](https://github.com/ aspnet/EntityFramework/wiki/Entity-Framework-Design-Meeting-Notes --- May-29,-2014)每个tenantDbContext都可以通过工厂基于url:tenant1.site.com实例化,并注入特定租户数据库的通用存储库操作。我将为每个请求使用一个实例。 –

相关问题