c# - 由于默认值约束,Code First 迁移失败

标签 c# entity-framework ef-code-first entity-framework-migrations

更改实体属性的类型时出现问题,已创建默认约束,但 EF 在更改列时未删除它,因此更新数据库失败。

该实体以前有一个 DateTime 属性。

public DateTime ImportDate { get; set; }

它的迁移包含在它的 Up() 方法中

AddColumn("dbo.Table", "ImportDate", c => c.DateTime(nullable: false));

但是,它也创建了一个默认约束

ALTER TABLE [dbo].[Table] ADD  DEFAULT ('1900-01-01T00:00:00.000') FOR [ImportDate]

ImportDate 正在更改为 DateTimeOffset

public DateTimeOffset ImportDate { get; set; }

并且由此产生的迁移有一个 AlterColumn

AlterColumn("dbo.Table", "ImportDate", c => c.DateTimeOffset(nullable: false, precision: 7));

但是,这失败了,因为存在默认约束。

我能想到的唯一方法是使用带有 DROP CONSTRAINT 的 Sql(...),但是,CONSTRAINT 有一个看似随机的名称 DF__Table__Import__5441852A 所以硬编码 SQL不会在任何地方都有效。

想法?

最佳答案

您可以创建一个扩展并在生成的迁移中使用它:

 internal static class MigrationExtensions
    {
        public static void DeleteDefaultContraint(this IDbMigration migration, string tableName, string colName, bool suppressTransaction = false)
        {
            var sql = new SqlOperation(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);", tableName, colName)) { SuppressTransaction = suppressTransaction };
            migration.AddOperation(sql);
        }
    }

像这样使用

this.DeleteDefaultContraint("dbo.Table", "ImportDate");

来自这篇文章:Group by in LINQ

关于c# - 由于默认值约束,Code First 迁移失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868518/

相关文章:

entity-framework - EF Code First、IoC 和 DbConnection

c# - 如何使用 C# 将数据属性添加到下拉菜单

c# - Entity Framework 代码优先错误 "Error Locating Server/Instance Specified"

c# - WinForms 中的 WPF 控件

c# - 选择具有 MEF 约定的无参数构造函数

c# - 使用 Entity Framework Code First 在 PostgreSQL 中存储图像

c# - WCF N 层架构

c# - Entity Framework 。查询加载了子类属性的父实体

c# - Unity3D - 检测 Windows 10 周年纪念日(版本号)

c# - .NET Core 中的原始 SQL