6

列を削除する移行操作中に、列を削除する前に最初に列の存在を確認する SQL を生成するにはどうすればよいでしょうか?

列の削除操作の場合、エンティティ フレームワークは現在、列を削除するために次のような SQL を生成します。

// Migration Operation:
DropColumn("dbo.Table", "Column");

// TSQL generated:
// Dependency management logic ...
ALTER TABLE [dbo].[Table] DROP COLUMN [Column]

最初に列の存在を確認するように SQL を変更するにはどうすればよいですか。

// Migration Operation:
DropColumn("dbo.Table", "Column");

// TSQL desired:
IF EXISTS (SELECT * FROM sys.columns WHERE object_id = Object_id('dbo.Table') AND name = 'Column')
BEGIN
    // Dependency management logic ...
    ALTER TABLE [dbo].[Table] DROP COLUMN [Column]
END

から継承することで、移行 SQL をカスタマイズできることを私は知っていますSqlServerMigrationSqlGenerator。そうしようとしても、デフォルトのドロップ列ロジックをIFブロックにラップできませんでした。以下の例を参照してください。

public class CustomSqlServerMigrationSqlGenerator: SqlServerMigrationSqlGenerator
{
    /// <summary>
    /// Drop column only if it exists.
    /// </summary>
    protected override void Generate(System.Data.Entity.Migrations.Model.DropColumnOperation dropColumnOperation)
    {
        using (var writer = Writer())
        {
            writer.WriteLine(
              "IF EXISTS (SELECT * FROM sys.columns WHERE object_id = Object_id('{0}') AND name = '{1}')",
              dropColumnOperation.Table,
              dropColumnOperation.Name);
            writer.WriteLine("BEGIN");
            Statement(writer);
        }

        // Default drop column logic
        base.Generate(dropColumnOperation);

        using (var writer = Writer())
        {
            writer.WriteLine("END");
            Statement(writer);
        }
    }
}

ソース:

4

1 に答える 1