Entity Framework не генерирует INNER JOIN с помощью .Include - PullRequest
0 голосов
/ 02 мая 2019

У меня есть проект, в котором .Include не генерирует INNER JOIN, тогда как INNER JOIN генерируется в других проектах с использованием того же DbContext и кода.

Я использую EF Core Code-First. 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; }
}

DbContext:

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, даже если он выглядит так, как будто он указывает на правильные.

UPDATE

Чтобы убедиться, что включение действительно не работает, я провел дополнительный тест. Если я отдельно загружаю AxosoftItems в DbContext, то EF будет заполнять коллекции Items для каждого AxosoftProject. Пример: * 1 023 *

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 игнорируется поле «Включить».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...