Несколько DbContexts на одной БД с миграцией кода

Я наткнулся на ту же проблему, как описано в этом вопросе. Кроме того, я не хотел терять таблицу __migrationHistory из базы данных.

Я попробовал это с предложенным Решением использования одного "супер" контекста, который содержит все DbSet<> и использования нормальных Контекстов, но я получил ошибку. ("Модель поддержки DbContext была изменена") Этого легко избежать, если просто убить таблицу __migrationHistory с сервера SQL, но, как я уже сказал, я хочу сохранить историю.

Я нашел простое и легкое решение, см. Мой ответ ниже.

2 ответа

Решение

Во-первых, вы должны создать "супер" контекст для конфигурации миграции.

MySuperContext : DbContext
{
    // All DbSet<> s from your different contexts have to be referenced here once, you will only use this class for the migrations.

    public MySuperContext() : base("YourConnectionString")
    {
        System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MySuperContext, MyMigrationsConfiguration>());
    }
}

Затем просто создайте следующий класс:

public class NoDatabaseInitializer<T> : IDatabaseInitializer<T> where T: DbContext
{
    public void InitializeDatabase(T context)
    {
        // Do nothing, thats the sense of it!
    }
}

Теперь, в каждом вашем маленьком контексте, добавьте это в конструктор:

class MyUserContext : DbContext
{
    public MyUserContext : base("MyConnectionString") // Can be a user context, etc
    {
        System.Data.Entity.Database.SetInitializer(new NoDatabaseInitializer<MyContext>());
    }
}

теперь вы больше не получите эту ошибку,
плюс, у вас будет история миграции,
и вы будете использовать несколько контекстов в одной базе данных.

EF6 поддерживает несколько DbContextв базе данных: http://entityframework.codeplex.com/wikipage?title=Multi-tenant%20Migrations

Другие вопросы по тегам