【问题标题】:DropColumn conditionally in a migration迁移中有条件的 DropColumn
【发布时间】:2014-01-21 04:40:19
【问题描述】:

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

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

问题在于,在某种程度上,部分数据库实例没有该列(长话短说)。我正在考虑使用Sql 删除它并在sys.columns 中搜索,或者将DropColumn 包装在try ... catch 中。

但也许有一些已知的方法可以通过实体框架迁移来做到这一点?

【问题讨论】:

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


    【解决方案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");
    }
    

    希望这会节省一个人的时间。

    【讨论】:

    • 决定在这里发布解决方案,以便有人可以重复使用。
    猜你喜欢
    • 2023-01-22
    • 1970-01-01
    • 2015-10-28
    • 2021-06-29
    • 2019-05-18
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多