entity-framework - 实体框架不使用 .Include 生成 INNER JOIN
问题描述
我有一个项目,其中 an.Include
不生成 INNER JOIN,而 INNER JOIN 是在其他项目中使用相同的 DbContext 和代码生成的。
我正在使用 EF Core 代码优先。DbContext 通过 NuGet 与其他项目共享。
以下是有问题的两个类及其在 DbContext 中的配置:
[Table("Project", Schema = "ProjectManagement")]
public class AxosoftProject
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AxosoftId { get; set; }
public int? AxosoftParentId { get; set; }
public AxosoftProject AxosoftParent { get; set; }
public List<AxosoftProject> Children { get; set; }
public string Name { get; set; }
public bool IsActive { get; set; }
public string Description { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public DateTime UpdateDate { get; set; }
public ICollection<AxosoftItem> Items { get; set; }
}
[Table("Item", Schema = "ProjectManagement")]
public class AxosoftItem
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int AxosoftId { get; set; }
public int AxosoftProjectId { get; set; }
public AxosoftProject AxosoftProject { get; set; }
public string Name { get; set; }
public string ItemType { get; set; }
public string SubItemType { get; set; }
public decimal PercentComplete { get; set; }
public DateTime UpdateDate { get; set; }
}
数据库上下文:
modelBuilder.Entity<AxosoftProject>().HasKey(x => x.AxosoftId);
modelBuilder.Entity<AxosoftProject>().HasOne(x => x.AxosoftParent).WithMany(x => x.Children);
modelBuilder.Entity<AxosoftProject>().HasMany(x => x.Items);
modelBuilder.Entity<AxosoftItem>().HasKey(x => x.AxosoftId);
modelBuilder.Entity<AxosoftItem>().HasOne(x => x.AxosoftProject);
查询所有项目及其项目的代码:
IMyEntities MyEntities = new MyEntities("Server=localhost;Database=MyEntities;Trusted_Connection=True;MultipleActiveResultSets=true");
var projects = MyEntities.AxosoftProjects.Include(x => x.Items).ToList();
var listwithitems = projects.Where(x => x.Items != null).ToList();
根据我在其中执行上述代码的项目,它要么执行 INNER JOIN,要么根本不执行 INNER JOIN。我尝试删除上面代码不执行 INNER JOIN 的整个项目,然后从存储库中克隆它以从新开始,仍然没有 INNER JOIN。
我该如何进一步调试呢?我怀疑它不起作用的项目可能正在使用旧版本的 DLL,即使它看起来指向正确的。
更新
为了验证包含确实不起作用,我做了一个额外的测试。如果我将 AxosoftItems 分别加载到 DbContext 中,那么 EF 将为每个 AxosoftProject 填充 Items 集合。例子:
var projects = MyEntities.AxosoftProjects.Include(x => x.Items).ToList();
var listwithitems1 = projects.Where(x => x.Items != null).ToList(); // 0 items
var items = MyEntities.AxosoftItems.ToList();
var listwithitems2 = projects.Where(x => x.Items != null).ToList(); // 41 items
更新 2
EF Core 的代码和引用被放置在 ASP.NET MVC 项目中。将代码移动到单独的类库“修复”了该问题,不会忽略 INNER JOIN,并且代码完全相同。我打算下载源代码并调试我的方式,以找出 MVC 项目中忽略 Include 的原因。
解决方案
推荐阅读
- clearcase - 可以将我签出的文件从实际目录复制到我的主目录中吗?
- html - 将组添加到关注者 - Phaser 3
- mysql - Spring Boot - MySQL 默认使用 InnoDB
- gremlin - 如何从 gremlin 中的顶点获取 id 和所有属性?
- python - GDAL 翘曲与移位向量
- c++ - 如何将整行写入犰狳矩阵?
- java - 使用 OAuth2 的 Spring Boot:Swagger 返回 Failed to load API 定义
- android - 从按钮选择中获取 ArrayList 中的位置
- python - 如何在python中检查csv文件是否为空?
- r - 将向量的值与第一个向量进行比较返回 NA 值