8

私たちのプロジェクトで 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 で移行を完了に設定することが期待されます。したがって、アプリが起動し、バックグラウンドのどこかでテーブルが更新されます。

しかしそうではなく、スレッドの実行中に移行が実行されているようです (これには多くの時間がかかります)。

したがって、私の質問は次のとおりです。

  1. DBmigrations でカスタム コードを実行することは、一般的に良い方法ですか?
  2. そうでない場合、私の場合、カスタム コードの実行の必要性をどのように達成できますか? (ストアドプロシージャまたは多少のビジネスロジックを書き直すことなく)
  3. はいの場合、私は何を間違っていますか? このコードを移行中にブロックせずに実行するにはどうすればよいですか?
4

1 に答える 1

3

DbMigration の Up メソッドと Down メソッドは、後で SQL に変換されるメモリ内モデルを構築するだけです。カスタム ロジックを実行するには、次の 2 つのオプションがあります。

  1. Sql メソッドを使用して、T-SQL を使用してデータベース サーバーでロジックを実行します。
  2. 移行構成クラス (通常は Migrations\Configuration.cs) の Seed メソッドでロジックを実行します。これは、Update-Database 中にすべての移行が適用された後に呼び出されます。
于 2012-11-14T17:10:48.280 に答える