列を削除する移行操作中に、列を削除する前に最初に列の存在を確認する 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);
}
}
}
ソース: