c# - 使用迁移删除/添加列的 "defaultvaluesql"

标签 c# entity-framework entity-framework-migrations

这里我使用 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,也不适用于表的定义。

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

有人遇到过这种情况吗?

最佳答案

实际上,在数据库中,为 defaultValueSql 创建了一个 Constraint,我认为这个参数是由 sys 表工作的,而不是 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]';");
}

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

关于c# - 使用迁移删除/添加列的 "defaultvaluesql",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29797772/

相关文章:

c# - 使用上下文键更改的脚手架迁移

c# - 如何以编程方式限制我的 C# 应用程序的带宽使用?

c# - for 循环 - "Unreachable code detected"- 测试

c# - 如何在 datagridview 中动态创建列并为其及其行分配标题?

c# - 如何在具有条件多个 where 条件的 Entity Framework 中编写查询?

entity-framework - EF 4.3 迁移抛出 "Unable to open configSource file"

c# - RestSharp:无法创建 SSL/TLS 安全通道

c# Entity Framework 与线程

c# - 在 C# 中获取类的名称作为字符串

entity-framework - 是否可以将 EF 迁移仅应用于本地/内存数据?