问题
I want to perform a column dropping in my Up migration. I am using EF 5.
DropColumn("dbo.MyObjects", "AttributeId");
The issue is that in some way part of database instances do not have that column (long story how). I am thinking of dropping it with Sql and searching in sys.columns, or wrapping DropColumn in try ... catch.
But maybe there is some known way to do it with Entity Framework migrations?
回答1:
There was also a default constraint on my column, so ended up with the following:
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");
}
Hope that will save one's time.
来源:https://stackoverflow.com/questions/20904865/dropcolumn-conditionally-in-a-migration