EF Core 8搭配Npgsql查询时非可空属性返回Null问题求助
针对你遇到的非可空Owned record属性查询返回Null的问题,可从以下几个方向排查:
确认Owned类型的映射配置
虽然你给WaypointDescription加了[Owned]特性,但显式在DbContext中配置映射往往能解决隐性的绑定问题。在OnModelCreating里添加如下配置:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Sid>() .OwnsOne(s => s.WaypointDescription); }另外,WaypointDescription是带
required属性的record类型,要确保它的构造函数是public的,且参数名称和属性名完全匹配——EF Core依赖构造函数参数映射来实例化对象,参数不匹配会导致无法正确创建实例,最终返回Null。核对Npgsql与EF Core版本兼容性
EF Core 8必须搭配8.0.x及以上版本的Npgsql.EntityFrameworkCore.PostgreSQL包,版本不匹配会导致Owned类型的映射逻辑出现异常。检查你的NuGet包管理器,确保两者版本完全一致。排查枚举类型的映射问题
WaypointDescription内部的枚举属性需要正确映射到数据库类型。可在OnModelCreating中显式配置枚举的转换规则:modelBuilder.Entity<Sid>() .OwnsOne(s => s.WaypointDescription) .Property(w => w.YourFirstEnumProp) .HasConversion<string>(); // 若数据库存储的是枚举字符串,用这个;若存整数则用HasConversion<int>()同时确认数据库中对应的枚举字段值都是合法的枚举定义值——如果存在数据库值和枚举不匹配的情况,EF Core无法解析枚举,进而导致整个WaypointDescription实例无法创建,最终返回Null。
验证查询的追踪行为
尝试使用无追踪查询排除缓存干扰:var record = db.Sids.AsNoTracking().First();另外检查是否有全局查询过滤器、投影操作无意中排除了Owned类型的属性,导致查询结果中没有对应字段的数据。
核对数据库表结构与实体的匹配度
确认数据库中Owned类型对应的字段(默认命名格式为WaypointDescription_EnumPropertyName)存在且未被重命名、删除。可以通过EF Core的迁移脚本或直接查看PostgreSQL表结构,确保字段名、数据类型和实体定义完全匹配。
内容的提问来源于stack exchange,提问作者Rob Jones

