【问题标题】: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");
}
希望这会节省一个人的时间。