Automapper & EF Core: отношения DOT-ко-многим раскрыты DTO - PullRequest
0 голосов
/ 01 мая 2020

У меня фактически определены следующие сущности:

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 на то, что у него может быть только одна сущность на класс (без колонки дискриминатора, которая бы победила цель!).

...