Entity Framework Core:将可空列迁移到必需时的默认值
Posted
技术标签:
【中文标题】Entity Framework Core:将可空列迁移到必需时的默认值【英文标题】:Entity Framework Core: default value when migrating nullable column to required 【发布时间】:2021-06-18 22:22:32 【问题描述】:我有一个 datetime2
列,以前是 nullable
。
我们现在需要设置此列,因此我们希望根据需要设置它并使用默认值 1970-1-1 迁移该列。
我已创建迁移并将迁移文件编辑为以下内容:
protected override void Up(MigrationBuilder migrationBuilder)
migrationBuilder.AlterColumn<DateTime>(
name: "Start",
table: "Project",
nullable: false,
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldNullable: true,
defaultValue: new DateTime(1970, 1, 1));
我已经手动添加了defaultValue: new DateTime(1970, 1, 1));
行。
不幸的是,更新数据库时出现以下错误:
2021-03-22 10:12:55.5398:“更新数据库”中发生错误: Microsoft.Data.SqlClient.SqlException (0x80131904):无法将值 NULL 插入列“开始”、表“dbo.Project”;列不允许空值。更新失败。 声明已终止。
我也尝试通过defaultValueSql
设置值,但出现同样的错误:
defaultValueSql: "'1970-1-1'"
为什么defaultValue不起作用,是我做错了吗?
提前致谢
顺便说一句:这是被执行的脚本:
DECLARE @var0 sysname;
SELECT @var0 = [d].[name]
FROM [sys].[default_constraints] [d]
INNER JOIN [sys].[columns] [c] ON [d].[parent_column_id] = [c].[column_id] AND [d].[parent_object_id] = [c].[object_id]
WHERE ([d].[parent_object_id] = OBJECT_ID(N'[Project]') AND [c].[name] = N'Start');
IF @var0 IS NOT NULL EXEC(N'ALTER TABLE [Project] DROP CONSTRAINT [' + @var0 + '];');
ALTER TABLE [Project] ALTER COLUMN [Start] datetime2 NOT NULL;
ALTER TABLE [Project] ADD DEFAULT '1970-01-01T00:00:00.0000000' FOR [Start];
【问题讨论】:
【参考方案1】:如果您想在 DB 中创建现有列 required
,您需要确保该列中没有空值。为了解决这个问题,请更新表并用值填充列。
migrationBuilder.Sql("UPDATE Project SET Start = GETDATE() WHERE Start is null");
migrationBuilder.AlterColumn<DateTime>(
name: "Start",
table: "Project",
nullable: false,
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldNullable: true,
defaultValue: new DateTime(1970, 1, 1));
【讨论】:
以上是关于Entity Framework Core:将可空列迁移到必需时的默认值的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework Core 6.0 中的新功能介绍
Entity Framework Core 6.0 中的新功能介绍
Entity Framework Core 6.0 中的新功能介绍
Entity Framework Core 6.0 中的新功能介绍