我有一个Web应用程序,应该将其作为一系列核心基础结构的插件组成。插件是经过编译的CLR dll +一些内容文件,这些文件将放置在特定位置。我正在使用Autofac扫描和注册程序集中的类型,并使用一些精美的路由从那里为 Controller 和 Assets 提供服务。但是,由于每个插件程序集都可以包含一个DbContext(按照惯例,每个插件都将使用其自己的数据库),所以我不太清楚该怎么做。
现在,我发现了很多有关如何使用多个上下文的内容,但这都需要知道它们在开发时的含义。我的应用程序直到运行时才知道将使用什么上下文。
我理想中正在寻找的是某种方法
ApplyMigrations<MyDbContext, MyDbConfiguration>();
尽管我还必须以某种方式提供一组有序的迁移才能应用(如果使用显式迁移)。
我目前绊脚的地方是标准
Database.SetInitializer(...)
因为它是一个静态单例,并且系统中的每个dbcontext都有其自己的初始化程序。
最佳答案
首先,在所有SetInitializer
中,将IDatabaseInitializer
对象存储在具有上下文Type作为键的字典中,因此,从理论上讲,多次调用SetInitializer
应该可以正常工作。
另一方面,如果这不起作用,则另一个选择是显式执行初始化:
class YourContext : DbContext
{
static YourContext()
{
Database.SetInitializer<YourContext>(YourMigratingDatabaseInitializer);
using (var context = new YourContext())
{
context.Database.Initialize(false);
}
}
public YourContext()
{
Database.SetInitializer<YourContext>(null);
}
}
关于c# - 带有插件样式系统的EF多上下文。如何在运行时应用迁移?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30397531/