EF Core查询Include操作报错:表达式不表示属性访问
解决EF Core Include子表关联记录时的错误
错误信息
表达式 'i.SiteToSiteItems' 在 'Include' 操作中无效,因为它不表示属性访问:'t => t.MyProperty'。要定位派生类型上声明的导航属性,请使用强制转换 ('t => ((Derived)t).MyProperty') 或 'as' 运算符 ('t => (t as Derived).MyProperty')。集合导航访问可通过组合 Where、OrderBy(Descending)、ThenBy(Descending)、Skip 或 Take 操作进行筛选。
问题场景
在VS2022环境下的.NET6 ASP.NET MVC Core应用中,使用EF Core查询父表SiteToSite时,尝试通过Include加载关联子表SiteToSiteItem记录,触发上述错误。已尝试将父表中SiteToSiteItems属性从IEnumerable<SiteToSiteItem>改为IList<SiteToSiteItem>和List<SiteToSiteItem>,但错误仍未解决。
相关代码
父表实体SiteToSite
[BindProperties] public partial class SiteToSite { [Required] [Display(Name = "Site to Site ID")] public int SiteToSiteID { get; set; } public virtual IEnumerable<SiteToSiteItem> SiteToSiteItems { get; set; } = null!; }
子表实体SiteToSiteItem
[BindProperties] public partial class SiteToSiteItem { [Required] [Display(Name = "Site to Site Item ID")] public int SiteToSiteItemID { get; set; } // 关联父表的外键 public int SiteToSiteID { get; set; } }
查询代码
public IList<SiteToSite> GetSiteToSitesById(int id) { var result = _context.SiteToSite.Where(s => s.SiteToSiteID == id).Include(i => i.SiteToSiteItems).ToList(); return result; }
解决方案
- 修正导航属性类型:EF Core要求集合导航属性必须是可实例化、可修改的集合类型,
IEnumerable<T>是只读枚举接口,无法满足EF的跟踪需求。将父表的SiteToSiteItems改为EF推荐的ICollection<T>类型:
public virtual ICollection<SiteToSiteItem> SiteToSiteItems { get; set; } = new List<SiteToSiteItem>();
- 添加反向导航属性:在子表
SiteToSiteItem中添加指向父表的导航属性,让EF Core能正确识别实体间的关联关系:
public virtual SiteToSite SiteToSite { get; set; } = null!;
- 确认DbContext配置:确保你的DbContext中已注册两个实体的DbSet:
public DbSet<SiteToSite> SiteToSite { get; set; } public DbSet<SiteToSiteItem> SiteToSiteItem { get; set; }
- 可选:显式配置关联关系:如果EF无法自动识别外键关联,可在DbContext的
OnModelCreating方法中显式配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<SiteToSiteItem>() .HasOne(s => s.SiteToSite) .WithMany(s => s.SiteToSiteItems) .HasForeignKey(s => s.SiteToSiteID); }
完成以上修改后,重新运行查询即可正常使用Include加载关联的子表记录。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

