EF7+ASP.NET5 beta8-数据库初始值设定项
我正在开发多租户应用程序ASP.NET5+EF7。每个租户都有单独的数据库。我将有一个单独的租户帐户数据数据库。我已经在这个单独的数据库的启动类中注册了EF服务。我对迁移有问题。我无法创建EF迁移,直到使用特定连接字符串将tenantDbContext注册为服务。但对于每个租户,此连接字符串必须是动态的。。。有什么想法吗?为租户管理DBContext的最佳选项是什么 未来的编辑保护覆盖无效配置是关键如何做:这是一个好的解决方案吗EF7+ASP.NET5 beta8-数据库初始值设定项,asp.net,asp.net-mvc,entity-framework,Asp.net,Asp.net Mvc,Entity Framework,我正在开发多租户应用程序ASP.NET5+EF7。每个租户都有单独的数据库。我将有一个单独的租户帐户数据数据库。我已经在这个单独的数据库的启动类中注册了EF服务。我对迁移有问题。我无法创建EF迁移,直到使用特定连接字符串将tenantDbContext注册为服务。但对于每个租户,此连接字符串必须是动态的。。。有什么想法吗?为租户管理DBContext的最佳选项是什么 未来的编辑保护覆盖无效配置是关键如何做:这是一个好的解决方案吗 services.AddEntityFramework()
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);
}
…etc正如我在评论中提到的,我自己没有尝试过多租户/多数据库,但尝试了以下方法: 您可以使用DbContext CreateIfNotExists方法 如果您有Migrations/Configuration.cs,则可以将AutomaticMigrationsEnabled属性设置为false 可能还需要关闭初始值设定项:Database.SetInitializernull 抱歉,我不知道更多细节,比如从DB自动创建新租户的工作流程,或者屏幕上填写了连接字符串和名称等。我无法给出更详细的建议。我建议将数据层从上下文中抽象出来。对于开发人员来说,选择正确的上下文似乎不是一个好主意。因此使用了工厂
一个选项总是要求将租户id传递到所有服务或存储库方法中。我猜这可能是控制器中可用的某种用户声明。我最初的想法是,不要在启动时连接上下文,而是从工厂获取上下文。类似于:ContextFactory.Createtenant。对于迁移,您可以使用:在此处添加迁移MyMigration-ConnectionString连接字符串?谢谢你的回复。新租户的调配必须自动化-C。。。想法:我可以在构造函数中用特定的连接字符串实例化DbContext以进行连接。问题是如何在没有迁移的情况下创建数据库我无法创建迁移,直到服务在启动类中注册为止我不会使用SQL脚本…也许是第二个想法。是否可以通过数据库初始值设定项在不迁移的情况下创建数据库?如果是,将来如何管理数据库更改?谢谢您的回答。好主意。。我现在有可能构建tenantDbContext。我在这里找到了EF7数据库初始值设定项:每个tenantDbContext都可以由factory基于url:tenant1.site.com进行实例化,并注入到通用存储库中,用于特定的租户数据库操作。我将为每个请求使用一个实例。