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

后端 未结 3 1757
再見小時候
再見小時候 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:40

    Ok, based on nemesv's answer (accepted), here's how I ended up fixing the problem for now, until a fix is officially issued:

    internal class MyFixedSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator
    {
        protected override void Generate(AlterColumnOperation alterColumnOperation)
        {
            if (alterColumnOperation == null)
                throw new ApplicationException("alterColumnOperation != null");
    
            ColumnModel column = alterColumnOperation.Column;
            if ((column.DefaultValue != null) || !string.IsNullOrWhiteSpace(column.DefaultValueSql))
            {
                using (IndentedTextWriter writer = Writer())
                {
                    writer.Write("ALTER TABLE ");
                    writer.Write(this.Name(alterColumnOperation.Table));
                    writer.Write(" ADD CONSTRAINT DF_");
                    writer.Write(alterColumnOperation.Table + "_"); //   <== THIS IS THE LINE THAT FIXES THE PROBLEM
                    writer.Write(column.Name);
                    writer.Write(" DEFAULT ");
                    writer.Write(column.DefaultValue != null ? base.Generate(column.DefaultValue) : column.DefaultValueSql);
                    writer.Write(" FOR ");
                    writer.Write(this.Quote(column.Name));
                    this.Statement(writer);
                }
            }
            using (IndentedTextWriter writer2 = Writer())
            {
                writer2.Write("ALTER TABLE ");
                writer2.Write(this.Name(alterColumnOperation.Table));
                writer2.Write(" ALTER COLUMN ");
                writer2.Write(this.Quote(column.Name));
                writer2.Write(" ");
                writer2.Write(this.BuildColumnType(column));
                if (column.IsNullable.HasValue && !column.IsNullable.Value)
                {
                    writer2.Write(" NOT NULL");
                }
                this.Statement(writer2);
            }
        }
    }
    
    
    internal sealed class Configuration : DbMigrationsConfiguration
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
    
            SetSqlGenerator("System.Data.SqlClient", new MyFixedSqlServerMigrationSqlGenerator());
        }
        ...
    }
    

提交回复
热议问题