Я использую Entity Framework Core после блога Chris Sakell here.Entity Framework Core - проблема с объектами, связанными с загрузкой, которые также содержат связанные объекты
Он использует generics для управления своими репозиториями, а также базовый репозиторий, который он использует для всех других репозиториев.
Часть базового репозитория имеет следующий код для извлечения единого объекта, который также загружает связанные объекты, используя опцию includeProperties
. Вот общий код для извлечения одного элемента.
public T GetSingle(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] includeProperties)
{
IQueryable<T> query = _context.Set<T>();
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
return query.Where(predicate).FirstOrDefault();
}
Я использую его на столе клиента, к которому прилагается много заданий.
Вот как я структурировал свой код.
public ClientDetailsViewModel GetClientDetails(int id)
{
Client _client = _clientRepository
.GetSingle(c => c.Id == id, c => c.Creator, c => c.Jobs, c => c.State);
if(_client != null)
{
ClientDetailsViewModel _clientDetailsVM = mapClientDetailsToVM(_client);
return _clientDetailsVM;
}
else
{
return null;
}
}
Линия:
.GetSingle(c => c.Id == id, c => c.Creator, c => c.Jobs, c => c.State);
успешно извлекает значения для состояния творца и работы.
Однако ничего не получено для этих связанных объектов, связанных с «заданиями».
В particuar, JobVisits
представляет собой совокупность посещений рабочих мест.
Для полноты я добавляю в «работу» и «jobvisit» сущности ниже
public class Job : IEntityBase
{
public int Id { get; set; }
public int? ClientId { get; set; }
public Client Client { get; set; }
public int? JobVisitId { get; set; }
public ICollection<JobVisit> JobVisits { get; set; }
public int? JobTypeId { get; set; }
public JobType JobType { get; set; }
public int? WarrantyStatusId { get; set; }
public WarrantyStatus WarrantyStatus { get; set; }
public int? StatusId { get; set; }
public Status Status { get; set; }
public int? BrandId { get; set; }
public Brand Brand { get; set; }
public int CreatorId { get; set; }
public User Creator { get; set; }
....
}
public class JobVisit : IEntityBase
{
...
public int? JobId { get; set; }
public Job Job { get; set; }
public int? JobVisitTypeId { get; set; }
public JobVisitType VisitType { get; set; }
}
Мой вопрос, как я могу изменить код хранилища выше, и мой GetSingle
использование, так что я могу также загрузить соответствующий enitities JobVisit
коллекция и другие связанные с этим отдельные компании Brand
и JobType
?