Entity Framework的Include方法能否与数据库View视图搭配使用?
结论
你当前的写法不可行,缺少必要的实体关联配置,EF Core无法识别View_1和Motors的关联关系,无法生成正确的关联查询SQL。
具体实现步骤
- 修正View_1实体的配置
给View_1实体添加主键标识,同时给Motors导航属性指定外键关联:
public class View_1 { [Key] // 显式指定主键 public int MotorId { get; set; } public int CompanyId { get; set; } public int TotSales1 { get; set; } public int TotSales2 { get; set; } [ForeignKey(nameof(MotorId))] // 指定当前实体的MotorId作为外键关联Motors表的主键 public virtual Motors Motors { get; set; } }
- 在DbContext中完成视图配置
你需要在DbContext中注册View_1的DbSet,同时显式指定它是视图,避免EF Core将其识别为普通表执行迁移操作:
// 注册DbSet public DbSet<View_1> View_1 { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<View_1>() .ToView("View_1") // 声明这是数据库视图,不是表 .HasKey(v => v.MotorId); }
- 正确调用查询
配置完成后即可使用你写的Include语法查询,如果你还需要加载Motors关联的LacCompanies数据,可以链式调用ThenInclude:
// 仅加载View_1和关联的Motors数据 var result = dbContext.View_1.Include(x => x.Motors).ToList(); // 同时加载Motors关联的LacCompanies数据 var resultWithCompany = dbContext.View_1 .Include(x => x.Motors) .ThenInclude(m => m.Company) .ToList();
优化建议
如果你的实际业务场景中View_1已经包含了Motors表的全部字段,不需要关联其他外键表的数据,可以不需要配置导航属性直接查询View_1即可,减少关联查询的性能损耗。
内容的提问来源于stack exchange,提问作者Emanuele Lacopo
相关产品推荐
相关产品推荐

