ASP.NET Core 7添加迁移报错:未提供必填属性值
EF Core迁移种子数据时,未标记[Required]的属性被判定为必填的原因及解决办法
核心原因
EF Core对属性的必填判定,不全靠[Required]特性,主要受以下两点影响:
可空引用类型约定
如果你项目开启了可空引用类型(C# 8及以上默认开启,项目文件里<Nullable>enable</Nullable>),那么所有未声明为可空的引用类型(比如public string MetaKeywords { get; set; }),EF Core会默认将其映射为数据库的NOT NULL列,也就是必填项。哪怕你没加[Required]特性,这个约定也会生效。基类的属性定义或配置继承
检查你的EntityBase基类,里面的MetaKeywords、MetaDescription是不是被定义成了非可空的引用类型?或者有没有在全局配置里给基类的这些属性设置了必填约束?子类TextField会继承这些约束,导致种子数据时必须提供值。
解决方法
针对上述原因,对应两种解决方式:
显式声明可空属性
把基类里的目标属性改成可空引用类型:public abstract class EntityBase { // 其他属性... public string? MetaKeywords { get; set; } public string? MetaDescription { get; set; } }用Fluent API强制配置可空
如果不想修改属性定义,就在DbContext的OnModelCreating方法里显式配置这些属性为非必填:protected override void OnModelCreating(ModelBuilder modelBuilder) { // 针对单个实体配置 modelBuilder.Entity<TextField>() .Property(t => t.MetaKeywords) .IsRequired(false); modelBuilder.Entity<TextField>() .Property(t => t.MetaDescription) .IsRequired(false); // 如果是基类所有子类都要生效,可配置基类 modelBuilder.Entity<EntityBase>() .Property(e => e.MetaKeywords) .IsRequired(false); }
另外,种子数据里如果这些属性允许为空,要么不赋值,要么明确写null,避免EF Core误解为你遗漏了必填值。
内容的提问来源于stack exchange,提问作者Andrew Rubles
相关产品推荐
相关产品推荐

