EF7 + ASP.NET5 beta8 - 数据库初始化程序

时间:2015-10-20 06:43:36

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

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

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

...等

1 个答案:

答案 0 :(得分:2)

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

您可以使用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<DatabaseContext>(null);

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

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