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

das*_*dot 6 .net c# migration entity-framework ef-code-first

在我们的项目中成功使用实体框架迁移.但是现在我遇到了一个特殊情况,我需要更新一个需要一些业务逻辑的表(在我们的应用程序中作为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();
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望该Up方法在启动线程后返回,EF将MigrationHistory中的迁移设置为完成.因此,应用程序可以启动,并在后台的某个地方更新表.

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

所以我的问题是:

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

bri*_*lam 3

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

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

  • 有人对此有任何答案吗?在 C# 中执行迁移逻辑将非常有用,并且能够处理复杂的迁移逻辑(即:将某些内容序列化为更改后的 JSON 结构,或跨字段/实体执行逻辑)。我们目前唯一的解决方案是运行一个单独的控制台应用程序来读取数据、执行转换并写入数据。我们需要确保在特定迁移运行后仅运行一次。非常丑陋/容易出错。 (4认同)