使用迁移的列的 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]';");
}
分享希望对其他人有所帮助。
这里我使用 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]';");
}
分享希望对其他人有所帮助。