具有插件式系统的EF多上下文.如何在运行时应用迁移?

Geo*_*uer 13 c# entity-framework ef-migrations

我有一个Web应用程序,它应该被组成一系列插件到核心基础结构中.插件是一个已编译的CLR dll +一些内容文件,它们将放在某个位置.我正在使用Autofac扫描和注册程序集中的类型,以及一些奇特的路由来从那里为控制器和资产提供服务.但是,由于每个插件程序集都可以包含一个DbContext(按照惯例,每个都将使用自己的数据库),我无法弄清楚该做什么.

现在我已经找到了很多关于如何使用多个上下文的东西,但这一切都需要知道这些在开发时会是什么.我的应用程序不知道在运行时之前将使用哪些上下文.

我正在寻找理想的是想要做某些事情

ApplyMigrations<MyDbContext, MyDbConfiguration>();
Run Code Online (Sandbox Code Playgroud)

虽然我也不得不提供一组有序的迁移来应用(如果使用显式迁移).

我目前绊倒的地方是标准

Database.SetInitializer(...)
Run Code Online (Sandbox Code Playgroud)

因为它是一个静态单例,我系统中的每个dbcontext都有自己的初始化程序.

jjj*_*jjj 1

首先,首先将对象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);
    }
}
Run Code Online (Sandbox Code Playgroud)