EF迁移中的自定义代码执行

在我们的项目中成功使用entity framework迁移。 但是现在我遇到了一个特殊情况,我需要更新一个需要一些业务逻辑的表(在我们的应用程序中作为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中的迁移设置为完成。 因此,应用程序可以启动,并在后台的某个地方更新表。

但事实并非如此,迁移似乎在线程运行时运行(这需要很多时间)。

所以我的相关问题:

  1. 一般来说,在DBmigrations中执行自定义代码是一种好习惯吗?
  2. 如果没有,我怎样才能在我的情况下完成自定义代码执行的需要? (没有重写存储过程中的业务逻辑或某种程度)
  3. 如果是的话,我做错了什么? 如何在迁移中执行此代码而不阻止它?

DbMigration上的Up和Down方法只是构建了一个内存模型,后来被转换为SQL。 您有两个执行自定义逻辑的选项:

  1. 使用Sql方法使用T-SQL在数据库服务器上执行逻辑。
  2. 在迁移配置类的Seed方法中执行逻辑(通常是Migrations \ Configuration.cs)。 在Update-Database期间应用所有迁移后调用此方法