Як можна відключити перші міграції коду


85

У мене є кодова модель сутності в EF5. Але я хочу керувати змінами бази даних вручну - я не хочу, щоб EF модифікував мою існуючу базу даних та всі її дані. Але коли я роблю паралельні зміни у відображенні EF та в базі даних, EF відмовляється працювати належним чином, кажучи мені, що мені потрібно використовувати першу міграцію коду. Як це вимкнути?


Відповіді:


100

встановіть для Database.SetInitializer значення null.

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }

2
Встановлення ініціалізатора на конструкторі екземпляра контексту не має сенсу. EF викличе ініціалізатор перед тим, як насправді дістатись до цього коду, якщо ви спробуєте створити новий контекст.
Jcl

1
Щойно перевірив відповідь, подивившись на «Діагностичний інструмент» у VS 2017. Виклики ADO.NET до того, як перший запит SQL-запиту зупинився, після встановлення ініціалізатора на нуль у конструкторі.
Карл

2
Це працює, як очікувалося. Це правда, EF раніше викликає ініціалізатор, але потім його повторний виклик всередині конструктора змушує DbContext просто ігнорувати міграції, якщо ви хочете ігнорувати той факт, що у вас __MigrationHistoryнемає останньої міграції, і ви не хочете робіть це все одно. У моєму випадку я використовую міграції в середовищі dev, але коли я розгортаюся до робочої версії, я використовую SSDT для оновлення бази даних. Тому EF поскаржиться, що модель змінилася, оскільки __MigrationHistoryне матиме останньої міграції, але я можу гарантувати, що база даних оновлена.
Аліссон,

Я б запропонував перенести виклик Database.SetInitializerз конструктора в конструктор класу. Це гарантує, що дзвінок здійснюється лише один раз.
Стівен

40

Тож найповніша відповідь, яку я знайшов, така:

  1. Видаліть Migrationsпапку у вашому проекті.
  2. Встановіть Database.SetInitializer<DatabaseContext>(null);всередині ініціалізатора DatabaseContext.
  3. Видаліть таблицю з __MigrationHistoryвашої бази даних. Для EF6 + таблиця знаходиться під, Tablesале для більш ранніх версій вона знаходиться під System Tables.
  4. Побудуйте і запустіть.
  5. Прибуток.

На жаль, після виконання цих кроків EF6 все ще перевіряє наявність __MigrationHistoryкожного разу під час запуску мого додатка, що додає ще кілька мілісекунд до часу запуску мого додатка. Чи є спосіб повністю відключити __MigrationHistoryперевірку?
Дай

27

Якщо ви хочете повністю вимкнути міграцію:

https://stackoverflow.com/a/9709407/141172

Однак я вважав, що краще залишити активованими перші міграції коду, але використовуйте -Scriptопцію, щоб EF створив для мене сценарій зміни БД, який я можу застосувати до кожної бази даних (розробка, контроль якості, виробництво) вручну:

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

Таким чином EF створить для мене сценарій змін, і я все ще повністю контролюю застосовувані зміни. Я редагую сценарії змін, як і будь-який інший вихідний код.


1
ваше посилання насправді не відповідає completely turn off migrations. Для цього: додайте Database.SetInitializer<YourContextType>(null)до запуску своєї програми
Don Cheadle

Будь-яка ідея, як цього досягти за допомогою EF Core?
Shimmy Weitzhandler

@Shimmy: EF Core ніколи не повинен автоматично намагатися змінити вашу базу даних. Див. Github.com/dotnet/efcore/issues/3152
Ерік Дж.,

26

Якщо ви вже використовували міграції, тоді зміна лише ініціалізатора не допоможе. Вам потрібно зайти в Management Studio, відкрити таблиці бази даних, перейти до System Tablesпапки та видалити __MigrationHistoryтаблицю, яка знаходиться там (для EF6 і вище, вона знаходиться безпосередньо під Tables). Це назавжди вимкне Міграції.


7
Таблиця __MigrationHistory знаходиться безпосередньо під Таблицями, а не Системними таблицями.
Пітер Гедберг,

6
@PeterHedberg Це справедливо для EF6 +. Для попередніх версій це було під System Tables.
Episodex

1
Ви також можете перейменувати таблицю, замість того щоб видаляти її, використовуючи sp_rename. Я також вимкнув ініціалізатор.
NMrt

2

Я щойно вирішив це "питання"

  1. Видалення таблиці "_MigrationHistory" з бази даних.
  2. Видалення папки "Міграції" з проекту.
  3. Оновлення файлу EDMX.
  4. Чистий проект і відновити його.

Наступне налаштування мого середовища

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0

Чи можу я запитати, що ви оновили у файлі EDMX? Я також використовую базу даних First, і вона все ще запитує неіснуючі таблиці міграції ... Дякую!
dalcam

Що робити, якщо пізніше нам знадобляться міграції, чи автоматично вона створює нову _MigrationHistoryтаблицю?
sairfan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.