Я задавал подобный вопрос, прежде чем относиться к под-связанным сущностям здесь однако в этот вопрос, который я задаю, ни одна из связанных сущностей, о которых я просил, не была включена.
Я использую шаблон репозитория, и одна из базовых сущностей имеет следующее для получения всех сущностей в таблице.
Я также использую отложенную загрузку, где все мои сущности имеют виртуальные для этих связанных сущностей ... например объект клиента выглядит следующим образом.
using System;
using System.Collections.Generic;
using JobsLedger.INTERFACES;
namespace JobsLedger.DATA.ENTITIES
{
#nullable enable
public class Client : IEntityBase, IAuditedEntityBase
{
public Client()
{
ClientNotes = new List<Note>();
Jobs = new List<Job>();
}
public string ClientNo { get; set; } = default!;
public bool Company { get; set; }
public string? CompanyName { get; set; }
public string? Abn { get; set; }
public bool IsWarrantyCompany { set; get; }
public bool RequiresPartsPayment { set; get; }
public string? ClientFirstName { get; set; }
public string ClientLastName { get; set; } = default!;
public string? Email { get; set; }
public string? MobilePhone { get; set; }
public string? Phone { get; set; }
public string? Address1 { get; set; }
public string? Address2 { get; set; }
public string? BankName { get; set; }
public string? BankBSB { get; set; }
public string? BankAccount { get; set; }
public bool Active { get; set; }
public DateTime? DateDeActivated { get; set; }
public bool Activity { get; set; }
// One warranty company client to a job.
public int? WarrantyCompanyId { get; set; }
public virtual Job? WarrantyCompany { get; set; }
// One suburb to a client.
public int? SuburbId { get; set; }
public virtual Suburb? Suburb { get; set; }
// If its a warranty company then we simply link it one to one to the brand id.
public virtual Brand? Brand { get; set; }
// Multiple notes for each client.
public virtual ICollection<Note> ClientNotes { get; set; }
// Multiple jobs for each client.
public virtual ICollection<Job> Jobs { get; set; }
public virtual ICollection<Job> WarrantyCompanyJobs { get; } = default!;
public int Id { get; set; }
}
#nullable disable
}
Вот строка в базовом репозитории generi c, которая предполагает загрузку всех клиентов, а также связанных объектов.
public virtual IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties)
{
IQueryable<T> query = _context.Set<T>();
return includeProperties.Aggregate(query, (current, includeProperty) => current.Include(includeProperty));
}
Дело в том, что предполагается загрузить все включенные объекты, а когда я внимательно посмотрел, они не загружаются.
Вот строка, которая использует это обобщенное выражение c для загрузки всех клиенты.
var clients = ClientDATARepository.AllIncluding(s => s.Jobs, s => s.Suburb, s => s.WarrantyCompany);
Идея состоит в том, что его IQueryable загружается только один раз, когда он становится списком объектов (я думаю). Это хорошо, но когда я заставил это быть списком, а затем фактически углубился в результат, у клиента нет никаких рабочих мест, пригорода или гарантийной компании и т. Д. c. То есть НИКАКИЕ связанные сущности не загружаются.
На самом деле не осознавая этого, я фактически использовал следующую строку позже, чтобы загрузить эти сущности одну за другой - здесь вы видите, что я загружаю задания:
_context.Entry(client).Collection(j => j.Jobs).Load();
Тем не менее, я бы подумал, что в первой строке должны быть загружены все связанные сущности, а также все теневые свойства этих связанных сущностей, а в приведенной выше строке кода нет ..
Что дает. Я мог бы просто выбрать всех клиентов с простым утверждением, если бы я просто хотел, чтобы свойства клиента не включали все свойства связанных сущностей, но я не получаю связанные сущности.
Почему эта первая строка не загружает все включенные свойства, а также теневые свойства каждой связанной сущности ... Просто получить все связанные сущности было бы началом ...
Может кто-то понять, почему он не загружает связанные сущности, и помочь мне настроить его так это делает ..