我正在开发多租户应用程序(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);
}
...等
答案 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传递到所有服务或存储库方法。我猜这将是控制器中可用的某种用户声明。