EF查询一对一关联Ad实体时SourceAddress为null且无法使用Include如何解决
方案1:使用显式加载(无需修改现有实体结构,推荐)
EF 内置了显式加载导航属性的API,不需要用到Include方法,你可以在查询得到Ad实例后手动加载关联的SourceAddress:
Ad ad = _db.Ads.FirstOrDefault(); if (ad != null) { // 手动加载Ad对应的SourceAddress导航属性 _db.Entry(ad).Reference(a => a.SourceAddress).Load(); }
方案2:手动分两次查询关联赋值
如果你的EF版本不支持显式加载,也可以直接查询对应的SourceAddress表手动赋值:
Ad ad = _db.Ads.FirstOrDefault(); if (ad != null) { ad.SourceAddress = _db.SourceAddresses.FirstOrDefault(sa => sa.AdId == ad.Id); }
方案3:启用延迟加载实现自动加载
如果希望访问导航属性时自动加载数据,可以配置延迟加载:
- 首先修改Ad实体的SourceAddress属性,添加
virtual修饰符:
public virtual SourceAddress SourceAddress { get; set; }
- 如果你用的是EF Core,安装
Microsoft.EntityFrameworkCore.ProxiesNuGet包,然后在DbContext的OnConfiguring方法中开启延迟加载代理:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLazyLoadingProxies() .UseSqlServer("你的连接字符串"); }
配置完成后你直接访问ad.SourceAddress属性就会自动触发查询加载数据。
额外注意事项
请先检查你DbContext中的一对一关系配置是否正确,如果关系配置错误也会导致导航属性加载失败,你可以在OnModelCreating方法中添加如下配置:
modelBuilder.Entity<Ad>() .HasOne(a => a.SourceAddress) .WithOne(sa => sa.Ad) .HasForeignKey<SourceAddress>(sa => sa.AdId);
另外注意你现有代码里的两个拼写问题:Ad类的desciption应为description,SourceAddress类的Coutry应为Country,避免后续其他逻辑出错。
内容的提问来源于stack exchange,提问作者YacineSM
相关产品推荐
相关产品推荐

