如何抑制EF Core中常量主键的Microsoft.EntityFrameworkCore.Model.Validation[20600]警告?
如何抑制EF Core针对布尔主键默认值的验证警告
我基于Brandstetter十年前的《One-Row》帖子设计了一张仅存单行数据的表,用布尔类型做主键加唯一约束,设计是有意为之且运行正常。但EF Core模型验证时会生成以下警告,想把它抑制掉:
warn: Microsoft.EntityFrameworkCore.Model.Validation[20600]
Property 'Id' on entity type 'Config' is part of a primary or alternate key, but has a constant default value set. Constant default values are not useful for primary or alternate keys since these properties must always have non-null unique values。
PostgreSQL表定义
CREATE TABLE config ( id boolean PRIMARY KEY DEFAULT TRUE, demo boolean NOT NULL DEFAULT FALSE, version text NOT NULL, venue text, CONSTRAINT config_unique CHECK (id) );
DbContext中的实体配置代码
modelBuilder.Entity<Config>(entity => { entity.HasKey(e => e.Id).HasName("config_pkey"); entity.Property(e => e.Id).HasDefaultValue(true); entity.Property(e => e.Demo).HasDefaultValue(false); });
方法1:全局忽略指定警告码
在DbContext的OnConfiguring方法里,通过ConfigureWarnings忽略EF Core的20600警告:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder // 此处保留你的数据库连接等其他配置 .ConfigureWarnings(warnings => warnings.Ignore(20600)); }
也可以用警告对应的枚举值提高可读性:
.ConfigureWarnings(warnings => warnings.Ignore(Microsoft.EntityFrameworkCore.Diagnostics.CoreEventIds.PrimaryKeyWithDefaultValue));
方法2:移除EF Core中主键的默认值配置
既然数据库层面已经设置了主键默认值,且表只会存在一行数据,直接删除EF配置里的HasDefaultValue(true)即可消除警告。修改后的代码:
modelBuilder.Entity<Config>(entity => { entity.HasKey(e => e.Id).HasName("config_pkey"); // 移除主键的默认值配置 entity.Property(e => e.Demo).HasDefaultValue(false); });
注意:如果用EF迁移管理数据库结构,需确认此操作不会影响现有数据库的默认值设置。
方法3:改用数据注解标记主键(可选)
如果偏好数据注解方式,直接用[Key]标记主键属性,不在代码中声明默认值,同样能避免警告:
public class Config { [Key] public bool Id { get; set; } [DefaultValue(false)] public bool Demo { get; set; } // 其他属性... }
内容的提问来源于stack exchange,提问作者Joe Ballard
相关产品推荐
相关产品推荐

