Есть ли простой способ вручную запустить метод Seed() миграции Entity Framework из консоли диспетчера пакетов, в том числе после миграции Down() Update-Database -TargetMigration foo
)? Ответ на «Run Code First Migration Seed Method without a migration» описывает, как вручную запустить метод Seed(), который должен вызвать Update-Database
, но это не работает, когда база данных находится на более старой миграции и не должна обновляться. Тот же вопрос задавали в «How to run Seed() method of Configuration class of migrations», но его задавали как часть многочастного вопроса, и эта часть остается без ответа (хотя весь вопрос отмечен как ответ).Ручной запуск метода миграции сущностей Framework Entity Framework, в том числе после переноса Down()
Я спрашиваю, потому что у меня есть код очистки, который необходимо запустить после того, как была применена миграция. Вызов из Seed() отлично подходит для миграции Up(). Однако я не знаю, как легко называть его для миграции Down(). Мне нужен простой, один или два лайнера, который будет работать от менеджера пакетов. Я знаю, что я мог бы вызвать метод C# после вызова [Reflection.Assembly] :: LoadFile() для всех необходимых DLL, но есть достаточно зависимостей, что это было бы громоздким и подверженным ошибкам.
Я знаю, что Seed() не является идеальным местом для кода очистки миграции Down(), чтобы добавить некоторый контекст на основе ответа DrewJordan), но использование Down(), к сожалению, не является жизнеспособным по нескольким причинам. С практической точки зрения, это нежизнеспособно, потому что очистка должна конвертировать несколько гигабайтных данных, и это вызвало сбой SQL Server Express, когда я попробовал простую копию в Down(), вероятно, потому, что результирующий размер транзакции был огромным. Во-вторых, даже с гипотетической точки зрения, я не верю, что есть способ конвертировать данные в объеме, необходимом в Down(), потому что текущие строки SQL не могут быть прочитаны в C# как часть транзакции и преобразование данных должен состояться в C#. Подробнее об этом ограничении см. Мой другой вопрос: «Transform data using c# during Entity Framework migration». Некоторый компромисс дизайна был необходим, чтобы заставить очистку работать, и я использовал Seed() как этот компромисс. Код очистки не нужно запускать из Seed() как таковой, но я не знаю, что еще можно вызвать из диспетчера пакетов без изменения текущей миграции.
Существует еще один сценарий, в котором было бы полезно вызывать Seed() или другой код очистки сам по себе, не изменяя текущую миграцию. Рассмотрим сценарий, в котором произошла ошибка в методе Seed()/cleanup. Вы исправляете ошибку и хотите повторно запустить ее, не меняя текущую миграцию. Включение логики очистки в Down() не решит проблему, потому что Down() не будет вызываться, когда база данных уже находится в этой миграции.
Я боюсь, что это не может достигаются с помощью метода Seed. Возможно, вам захочется развить EntityFramework и добавить туда перехват миграции, но, скорее всего, вам просто нужно подумать о другом способе реализации этого. В чем причина этой огромной очистки кода для каждой миграции? –
@raderick Whoa - Я не понял, что источник доступен для Entity Framework. Благодаря! Я собираюсь копать его, чтобы увидеть, могу ли я найти другое обходное решение. ... Очистка предназначена для одной конкретной миграции, просто не представляется возможным сделать преобразование в Up()/Down(), потому что преобразование выполняется в C#. Набор данных - это огромное. – twm
Можете ли вы достичь своей цели, просто добавив этот код миграции в качестве модульного теста и отметьте его атрибутом [Игнорировать] и запустите его вручную? –