Entity Framework Core 7查询时Owned对象始终为null的问题求助
我定义了一个简单的Person类:
public class Person { public int Id { get; set; } public Address Info { get; set; } }
其中Address是EF Core的Owned实体:
[Microsoft.EntityFrameworkCore.Owned] public class Address { public string? Street { get; set; } public string? City { get; set; } }
使用EF Core 7.0.5版本,通过add-migration正常创建数据库,且数据已正确存储,但查询Person时Info属性始终为null。尝试过将Address属性改为非可空并设默认值、查询时用Include、在OnModelCreating中配置OwnsOne、修改属性类型、添加[Required]注解等方法,均无效。
以下是针对性的排查和解决步骤:
修正实体属性的可空性与初始化
Person中的Info是非可空引用类型,但如果数据库中Address对应的字段全为null,EF Core不会自动实例化Address对象。可以将Info改为可空,或者在构造函数中初始化:// 方案1:改为可空属性 public class Person { public int Id { get; set; } public Address? Info { get; set; } } // 方案2:构造函数初始化 public Person() { Info = new Address(); }显式配置Owned实体的字段映射
在OnModelCreating中明确指定Owned实体的字段映射,避免命名或映射异常:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Person>() .OwnsOne(p => p.Info, builder => { builder.Property(a => a.Street).HasColumnName("Info_Street"); builder.Property(a => a.City).HasColumnName("Info_City"); }); }执行
add-migration和Update-Database更新数据库结构。简化查询语句
EF Core 3.0+对Owned实体默认是自动包含的,无需手动调用Include。同时检查查询代码的语法错误(比如之前代码中person.Id = id是赋值操作,应改为==):var person = _dataContext.Persons.FirstOrDefault(p => p.Id == id);验证数据库数据
确认Person表中对应的Address字段(如Info_Street、Info_City)是否有有效值。如果所有字段均为null,EF Core可能不会创建Address实例,手动更新一条数据设置非空值后再测试。重置迁移与数据库
旧迁移可能存在隐藏的映射问题,删除现有迁移文件和数据库,重新生成迁移并初始化:Remove-Migration Add-Migration InitialCreate Update-Database重新插入测试数据后执行查询。
内容的提问来源于stack exchange,提问作者Maor Solomonov

