DropColumn有条件地在迁移中

时间:2014-01-03 13:34:28

标签: sql .net entity-framework-5 database-migration

我想在我的Up迁移中执行一个列删除。我正在使用EF 5。

DropColumn("dbo.MyObjects", "AttributeId");

问题是,在某种程度上,部分数据库实例没有该列(长篇故事如何)。我正在考虑将其删除Sql并在sys.columns中搜索,或将DropColumn包装在try ... catch中。

但也许有一些已知的方法来实现Entity Framework迁移?

1 个答案:

答案 0 :(得分:1)

我的列上也有一个默认约束,因此最终得到以下结果:

public override void Up()
{
    Sql(@"IF EXISTS(
     SELECT 1 FROM sys.columns c
     INNER JOIN sys.tables t ON t.object_id = c.object_id
     WHERE c.name = 'AttributeId' AND t.name = 'MyObjects')
     BEGIN
       DECLARE @AttributeIdDefConstraint nvarchar(128)
       SELECT @AttributeIdDefConstraint = name
       FROM sys.default_constraints
       WHERE parent_object_id = object_id(N'dbo.MyObjects')
         AND col_name(parent_object_id, parent_column_id) = 'AttributeId';
       IF @AttributeIdDefConstraint IS NOT NULL
       BEGIN
     EXECUTE('ALTER TABLE [dbo].[MyObjects] DROP CONSTRAINT ' + @AttributeIdDefConstraint)
       END
       ALTER TABLE [dbo].[MyObjects] DROP COLUMN [AttributeId]
     END");
}

希望能节省一个时间。