EF Core中Rider误提示需Include复杂属性的问题排查与解决
问题描述
我在EF Core中使用复杂属性(Complex Property)编写了示例应用,查询Customer DbSet时,Rider弹出错误提示,建议我Include Address属性:
但按照提示尝试IncludeAddress时,会触发运行时异常:
The expression 'customer.Address' is invalid inside an 'Include' operation, since it does not represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, use casting ('t => ((Derived)t).MyProperty') or the 'as' operator ('t => (t as Derived).MyProperty'). Collection navigation access can be filtered by composing Where, OrderBy(Descending), ThenBy(Descending), Skip or Take operations.
附示例代码:
using Microsoft.EntityFrameworkCore; await using var context = new AppDbContext(); context.Database.EnsureCreated(); var customers = await context.Customers .ToListAsync(); var customerQueryInMemory = customers .Where(c => c.Address.Street == "123 Main St") .ToList(); Console.WriteLine(customerQueryInMemory.Count); internal class AppDbContext : DbContext { public DbSet<Customer> Customers { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("CONNECTION_STRING"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Customer>() .ComplexProperty(c => c.Address); } } public class Address { public string Street { get; set; } public string City { get; set; } public string ZipCode { get; set; } } public class Customer { public int Id { get; set; } public string Name { get; set; } public Address Address { get; set; } }
原因分析
- Rider的代码分析逻辑混淆了EF Core中的复杂属性和导航属性:导航属性代表关联实体(需要通过Include加载),而复杂属性是嵌入到主实体表中的值对象,查询主实体时会自动加载,不需要额外Include。
- 当前版本的Rider没有正确识别通过
ComplexProperty配置的属性类型,误将其判定为需要Include的导航属性,因此弹出错误提示。
解决方法
根本消除提示的方案
- 更新Rider到最新版本:JetBrains可能已经在后续版本中修复了这个误判问题,升级后大概率能解决。
- 调整查询逻辑,将过滤移至EF Core查询阶段:把内存中的过滤逻辑直接整合到EF Core的LINQ查询中,这样Rider会正确识别属性使用场景,不会误触发提示:
// 替换原有的两次查询,直接在数据库层面过滤 var customerQuery = await context.Customers .Where(c => c.Address.Street == "123 Main St") .ToListAsync(); - 提交Bug反馈:如果最新版Rider仍存在该问题,可以到JetBrains官方反馈渠道提交Bug,帮助官方修复这个分析逻辑漏洞。
临时规避(不推荐,除非上述方案无效)
如果暂时无法升级或调整查询,可以通过添加注释禁用单个提示:
// ReSharper disable once EFCoreIncludeNavigationNotFound var customers = await context.Customers .ToListAsync();
或者修改.editorconfig文件全局禁用该规则,但这会影响其他正常的导航属性提示,不建议使用。
是否是Rider Bug?
是的,这属于Rider代码分析工具的Bug,其没有正确区分EF Core中复杂属性和导航属性的差异,导致了错误的提示。
内容的提问来源于stack exchange,提问作者dhrm

