18

そのため、Entity フレームワークによって大量の移行が行われたアプリケーションがあります。一度にすべての移行のスクリプトを取得したいのですが、-Scriptタグを使用するとうまくいきます。

ただし... SQLにステートメントを追加しないため、次GOのような問題が発生しますAlter view should be the first statement in a batch file...

Sql("GO");私はこの問題を検索し、手動でヘルプを追加してきましたが、スクリプト全体に対してのみです。パッケージ コンソール マネージャーを再度使用すると、例外が返されます。

System.Data.SqlClient.SqlException (0x80131904): Could not find stored procedure 'GO'.

タグを使用する場合にのみGOこれらのタグを追加する方法はありますか? そうでない場合、これに対する良いアプローチは何ですか?-Script

注: 複数のファイルを作成することも試みましたが、移行が非常に多いため、毎回これを維持することはほぼ不可能です。

4

5 に答える 5

12

エンティティ フレームワークの移行によって生成された SQL を変更するには、新しいSqlServerMigrationSqlGenerator

移行履歴の前後に GO ステートメントを追加するためにこれを行いました。

public  class MigrationScriptBuilder: SqlServerMigrationSqlGenerator
{
    protected override void Generate(System.Data.Entity.Migrations.Model.InsertHistoryOperation insertHistoryOperation)
    {
        Statement("GO");

        base.Generate(insertHistoryOperation);

        Statement("GO");

    }
}

次に、Configurationコンストラクター Migrationsを (DbContext があるプロジェクトのフォルダーに) 追加して、この新しい sql ジェネレーターを使用するようにします。

[...]
internal sealed class Configuration : DbMigrationsConfiguration<PMA.Dal.PmaContext>
{
    public Configuration()
    {
        SetSqlGenerator("System.Data.SqlClient", new MigrationScriptBuilder());
        AutomaticMigrationsEnabled = false;
    }
[...]

-Script タグを使用してスクリプトを生成するとinsert into [__MigrationHistory]GO

または、実装でSqlServerMigrationSqlGeneratorスクリプト生成の任意の部分をオーバーライドできます。これInsertHistoryOperationは私たちに適していました。

于 2013-06-14T11:35:55.497 に答える
-3

現在のステートメントを .Replace("GO", ""); に置き換えるだけです。

于 2015-01-23T13:50:16.383 に答える