我有一个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/

10-12 12:44
查看更多