Как я могу отключить использование таблицы __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
Ответ 2
Передайте значение null в System.Data.Entity.Database
public static void SetInitializer<TContext>(
IDatabaseInitializer<TContext> strategy
)
where TContext : DbContext
чтобы отключить инициализацию для вашего контекста. Не используйте IDatabaseInitializer
, чтобы отключить его.
https://msdn.microsoft.com/en-us/library/system.data.entity.database.setinitializer(v=vs.113).aspx