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 中的新功能介绍

Entity Framework Core 6.0 预览4 性能改进

Entity Framework Core快速开始