Как я могу отключить использование таблицы __MigrationHistory в Entity Framework 4.3 Code First?

Я использую Entity Framework 4.3 Code First с инициализатором пользовательской базы данных следующим образом:

public class MyContext : DbContext
{
    public MyContext()
    {
        Database.SetInitializer(new MyContextInitializer());
    }
}

public class MyContextInitializer : CreateDatabaseIfNotExists<MyContext>
{
    protected override void Seed(MyContext context)
    {
        // Add defaults to certain tables in the database

        base.Seed(context);
    }
}

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

При повторном запуске приложения я получаю следующую ошибку:

Ошибка сервера в приложении "/".

Модель, поддерживающая контекст "MyContext", изменилась с момента создания базы данных. Рассмотрите возможность использования First First Migrations для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269).

Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительной информации об ошибке и ее возникновении в коде.

Сведения об исключении: System.InvalidOperationException: модель, поддерживающая контекст "MyContext", изменилась с момента создания базы данных. Рассмотрите возможность использования Первых Миграций для обновления базы данных (http://go.microsoft.com/fwlink/?LinkId=238269).

Используя EFProfiler, я также замечаю выполнение этих запросов:

-- statement #1
SELECT [GroupBy1].[A1] AS [C1]
FROM   (SELECT COUNT(1) AS [A1]
        FROM   [dbo].[__MigrationHistory] AS [Extent1]) AS [GroupBy1]

-- statement #2
SELECT TOP (1) [Project1].[C1]          AS [C1],
               [Project1].[MigrationId] AS [MigrationId],
               [Project1].[Model]       AS [Model]
FROM   (SELECT [Extent1].[MigrationId] AS [MigrationId],
               [Extent1].[CreatedOn]   AS [CreatedOn],
               [Extent1].[Model]       AS [Model],
               1                       AS [C1]
        FROM   [dbo].[__MigrationHistory] AS [Extent1]) AS [Project1]
ORDER  BY [Project1].[CreatedOn] DESC

Как я могу предотвратить это?

Ответ 1

Сначала я был уверен, что это было потому, что вы задали инициализатор по умолчанию в ctor, но, исследуя бит, я обнаружил, что инициализатор не запускается при создании контекста, а когда вы впервые запрашиваете/добавляете что-то.

Предоставляемый инициализатор проверяет совместимость модели, поэтому вам не повезло с ними. Вы можете легко сделать свой собственный инициализатор, как это, но:

 public class Initializer : IDatabaseInitializer<Context>
    {

        public void InitializeDatabase(Context context)
        {
            if (!context.Database.Exists())
            {
                context.Database.Create();
                Seed(context);
                context.SaveChanges();
            }
        }

        private void Seed(Context context)
        {
            throw new NotImplementedException();
        }
    }

Это не должно проверять совместимость и если База данных отсутствует, она создаст ее.

UPDATE: "Контекст" должен быть типом вашей реализации DbContext