首页 > 解决方案 > 实体框架不使用 .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 的原因。

标签: entity-frameworkentity-framework-core

解决方案


推荐阅读