Выполнение пользовательского кода в EF-миграциях
Успешно работаем с миграциями Entity Frameworks в нашем проекте. Но теперь я столкнулся с особым случаем, когда мне нужно обновить таблицу, нуждающуюся в некоторой бизнес-логике (расположенной в нашем приложении как код C #). Поэтому я пытался порождать поток в миграцияхUp
метод и делая это обновление таблицы с бизнес-логикой. Это обновление таблицы не требуется для выполнения приложения и должно происходить в фоновом режиме.
Я делаю это примерно так:
public partial class MyMigration : DbMigration
{
public override void Up()
{
// ... do some sql migration here ...
// after executing the sql migrations custommethod should run
// migration seems to wait until CustomMethod finished work
new Thread(() => ExecuteCustomMethodDatabaseContext()).Start();
}
}
Я ожидаю, чтоUp
Метод возвращается после запуска потока, а EF устанавливает миграцию в MigrationHistory как выполненную. Таким образом, приложение может запуститься, и где-то в фоновом режиме таблица обновится.
Но не так, миграция, кажется, выполняется во время работы потока (это занимает много времени).
Итак, мои соответствующие вопросы:
Это хорошая практика для выполнения пользовательского кода в DBmigrations?Если нет, то как я могу выполнить необходимость выполнения пользовательского кода в моем случае? (без переписывания бизнес-логики в хранимой процедуре или в некоторой степени)Если да, что я делаю не так? Как я могу выполнить этот код в рамках миграции и не блокируя его?