使用迁移的列的 Remove/Add "defaultvaluesql"

Remove/Add "defaultvaluesql" of a column using Migration

这里我使用 EF6 迁移了 CodeFirst

public override void Up()
{
    CreateTable(
        "dbo.MyTable",
        c => new
            {
                Id = c.Int(nullable: false, identity: true),
                Date = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),
            })
        .PrimaryKey(t => t.Id);
}

但是我们发现Date插入时无法自定义。所以我们需要迁移来删除 Date 列上的 defaultValueSql 参数。

我试过使用不带 defaultValueSql 参数的 AlterColumn

public override void Up()
{
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: false));
}

public override void Down()
{
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"));
}

它既不能用于插入和更新 Date,也不能用于 table 的定义。

CREATE TABLE [dbo].[MyTable] (
    [Id] INT      IDENTITY (1, 1) NOT NULL,
    [Date]        DATETIME        DEFAULT (getutcdate()) NOT NULL,
);

有人 运行 遇到过这种情况吗?

分两个阶段尝试:

public override void Up()
{
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: true,
                                                       defaultValue: "NULL"));
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: false));
}

实际上,在数据库中,为 defaultValueSql 创建了一个 Constraint,我认为这个参数由 sys [=24] =],而不是 MyTable,这导致我的 AlterColumn.

无效

最终,我创建了一些原创的 SQL 命令,如下所示:

public override void Up()
{
    Sql(@"
    DECLARE @sql NVARCHAR(MAX)
    SELECT @sql = N'alter table [EffectiveDonations] drop constraint ['+d.name+N']'
    FROM sys.default_constraints
    WHERE d.parent_object_id = OBJECT_ID(N'MyTable')
    AND col_name(parent_object_id, parent_column_id) = N'Date'
    EXEC (@sql)
    ");
    Sql("PRINT 'Information: delete [defaultvaluesql]';");
}

public override void Down()
{
    Sql(@"ALTER TABLE [MyTable] ADD DEFAULT getutcdate() FOR [Date]");
    Sql("PRINT 'Information: create [defaultvaluesql] for column [Date] of table [MyTable]';");
}

分享希望对其他人有所帮助。