EF Core 5使用HasDefaultValue FluentAPI设置默认值插入报NULL错误如何解决
EF Core 5 字段默认值不生效问题解决方法
核心原因
你的配置缺少关键的生成值标记,同时可能存在配置与实体定义不匹配、数据库结构未更新的问题:
- EF Core 仅配置
HasDefaultValue不足以触发数据库默认值逻辑,需要额外告知EF Core该字段的值在插入时由数据库生成 - 若配置了
IsRequired()但实体属性定义为可空的string?,会导致EF Core直接传入NULL值触发数据库非空约束 - 修改FluentAPI配置后未执行迁移更新数据库,导致数据库表字段未添加默认值约束
解决方案
1. 修正FluentAPI配置
给FirstName字段添加ValueGeneratedOnAdd()配置,完整配置如下:
entity.Property(e => e.FirstName) .IsRequired() // 若字段允许为null可删除该行 .HasDefaultValue("john") .ValueGeneratedOnAdd() // 关键配置:插入时由数据库生成值 .HasMaxLength(100) .IsUnicode(false);
2. 统一实体定义与配置规则
如果保留IsRequired()配置,将实体的FirstName属性修改为非空类型,避免CLR默认值null与非空约束冲突:
// 修改前 public string? FirstName { get; set; } // 修改后 public string FirstName { get; set; } = string.Empty;
3. 更新数据库结构
在包管理控制台执行迁移命令,将默认值约束同步到数据库:
Add-Migration AddFirstNameDefaultValue Update-Database
验证逻辑
修改完成后运行测试代码,EF Core生成的INSERT语句会自动忽略FirstName字段,由数据库填充默认值john,不会再触发NULL插入报错。
内容的提问来源于stack exchange,提问作者JohnG
相关产品推荐
相关产品推荐

