EF 4.3.1 Migration Exception - AlterColumn defaultValueSql creates same default constraint name for different tables

后端 未结 3 1758
再見小時候
再見小時候 2020-12-06 14:03

I have a DB that I created using the OOB database initializer, and I am using Code First with EF 4.3.1.

I wanted to take advantage of the new \"IgnoreChanges\" flag

3条回答
  •  不思量自难忘°
    2020-12-06 14:35

    This solution tested in EF 6.1.3. most probably work on previous versions.

    You can implement a custom sql generator class derived from SqlServerMigrationSqlGenerator from System.Data.Entity.SqlServer namespace:

    using System.Data.Entity.Migrations.Model;
    using System.Data.Entity.SqlServer;
    
    namespace System.Data.Entity.Migrations.Sql{
        internal class FixedSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator {
            protected override void Generate(AlterColumnOperation alterColumnOperation){
                ColumnModel column = alterColumnOperation.Column;
                var sql = String.Format(@"DECLARE @ConstraintName varchar(1000);
                DECLARE @sql varchar(1000);
                SELECT @ConstraintName = name   FROM sys.default_constraints
                    WHERE parent_object_id = object_id('{0}')
                    AND col_name(parent_object_id, parent_column_id) = '{1}';
                IF(@ConstraintName is NOT Null)
                    BEGIN
                    set @sql='ALTER TABLE {0} DROP CONSTRAINT [' + @ConstraintName+ ']';
                exec(@sql);
                END", alterColumnOperation.Table, column.Name);
                    this.Statement(sql);
                base.Generate(alterColumnOperation);
                return;
            }
            protected override void Generate(DropColumnOperation dropColumnOperation){
                var sql = String.Format(@"DECLARE @SQL varchar(1000)
                    SET @SQL='ALTER TABLE {0} DROP CONSTRAINT [' + (SELECT name
                        FROM sys.default_constraints
                        WHERE parent_object_id = object_id('{0}')
                        AND col_name(parent_object_id, parent_column_id) = '{1}') + ']';
                PRINT @SQL;
                    EXEC(@SQL); ", dropColumnOperation.Table, dropColumnOperation.Name);
    
                        this.Statement(sql);
                base.Generate(dropColumnOperation);
            }
        }
    }
    

    and set this configuration:

    internal sealed class Configuration : DbMigrationsConfiguration
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
    
            SetSqlGenerator("System.Data.SqlClient", new FixedSqlServerMigrationSqlGenerator ());
        }
        ...
    }
    

提交回复
热议问题