У меня фактически определены следующие сущности:
public class Order
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Part
{
public int Id { get; set; }
public string Description { get; set; }
public int? OrderId { get; set; }
public Order Order { get; set; }
}
Они настроены так, что OrderId в Части связан с Идентификатором заказа:
// Order Model Builder
var orderModelBuilder = modelBuilder.Entity<Order>()
.ToTable("Orders");
orderModelBuilder.HasKey(i => i.Id);
orderModelBuilder.HasMany<Part>()
.WithOne()
.HasForeignKey(i => i.OrderId);
// Part Model Builder
var partModelBuilder = modelBuilder.Entity<Part>()
.ToTable("Parts");
partModelBuilder.HasKey(i => i.Id);
partModelBuilder.HasOne(i => i.Order)
.WithMany()
.HasForeignKey(i => i.OrderId);
Теперь я хотел бы сопоставьте их с подробным DTO заказа, который включает в себя коллекцию деталей для заказа:
public class PartDto
{
public int Id { get; set; }
public string Description { get; set; }
}
public class OrderDetailsDto
{
public int Id { get; set; }
public string Name { get; set; }
public List<PartDto> Parts { get; set; }
}
В настоящее время я использую ProjectMo () Automapper для обработки запросов, чтобы я мог запросить то, что я хочу, и получить список заказов Назад уже сопоставлены с моим желаемым DTO. Теперь я хочу добавить детали к этому запросу, чтобы можно было вернуть все заказы с деталями в одном запросе без необходимости выполнения l oop заказов и индивидуальной выборки деталей для каждого возвращенного заказа. Я мог бы легко это сделать, если бы List был частью класса сущности Order, но добавить его на этом этапе на самом деле не вариант.
CreateMap<Part, PartDto>()
.ForMember(d => d.Id, a => a.MapFrom(s => s.Id))
.ForMember(d => d.Description, a => a.MapFrom(s => s.Description))
;
CreateMap<Order, OrderDetailsDto>()
.ForMember(d => d.Id, a => a.MapFrom(s => s.Id))
.ForMember(d => d.Name, a => a.MapFrom(s => s.Name))
.ForMember(d => d.Parts, a => a.MapFrom(s => ?????))
;
.
..
...
await dbContext.Set<Order>().Where(...).ProjectTo<OrderDetailsDto>(configurationProvider).ToListAsync()
Я знаю, что могу получить теневые переменные, используя EF.Property (object, имя), но не уверен, как загрузить ограниченную коллекцию (dbContext.Set.Where (i => i.OrderId == orderId)). Буду очень признателен за любые предложения!
-
Я также открыт для добавления другого класса сущностей, если есть способ заставить его существовать рядом с существующей сущностью. Пока что я не могу найти способ сделать это без жалобы EF Core на то, что у него может быть только одна сущность на класс (без колонки дискриминатора, которая бы победила цель!).