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