Entity Framework Core 6.0 字符串默认不可为空相关问题咨询
差异产生原因
- EF Core 6.0 开始默认适配 C# 8.0 引入的*可空引用类型(NRT)*语义,同时 .NET 6 及更高版本的项目模板会默认在项目配置文件(.csproj)中开启
<Nullable>enable</Nullable>配置。 - 开启可空引用类型后,未加
?修饰的string类型会被识别为非空引用类型,EF Core 6 迁移生成器会根据该语义将对应数据库字段生成为nullable: false。 - EF Core 5.0 对应的 .NET 5 项目默认关闭可空引用类型配置,此时所有引用类型都会被EF Core默认判定为可空,因此字符串类型字段默认生成
nullable: true的配置。
配置调整方案
分两类场景处理:
1. 仅调整单个字段的可空性
如果仅需要Address字段允许为空,两种实现方式:
- 直接将属性声明为可空字符串:
public string? Address { get; set; }
- 也可以通过Fluent API显式配置允许为空:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<TestModel>() .Property(t => t.Address) .IsRequired(false); }
2. 全局恢复EF Core 5.0的默认字符串可空行为
如果要全局关闭EF Core对可空引用类型的适配,回到所有字符串默认允许为空的逻辑,在OnModelCreating中添加如下配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Properties<string>() .Configure(p => p.IsRequired(false)); }
也可以直接在项目配置文件(.csproj)中删除 <Nullable>enable</Nullable> 配置项,关闭整个项目的可空引用类型检查,EF Core会自动回到旧版本的映射逻辑。
内容的提问来源于stack exchange,提问作者Saqlain Mushtaq
相关产品推荐
相关产品推荐

