Как хранить сущности со многими отношениями, используя AutoMapper и EF Core? - PullRequest
2 голосов
/ 18 февраля 2020

У меня есть три сущности, Product, Feature и ProductFeature. ProductFeature является таблицей соединений, поддерживающей список обеих сущностей.

public class Product
{
    public ICollection<ProductFeature> ProductFeatures { get; set; }
}

public class Feature
{
    public ICollection<ProductFeature> ProductFeatures { get; set; }
}

public class ProductFeature
{
    public Product Product { get; set; }
    public Feature Feature { get; set; }
}

Я хочу скрыть таблицу отношений в DTO и представить функции с помощью простой совокупности, например:

public class ProductDTO
{
    public ICollection<Feature> Features { get; set; }
}

Я использую AutoMapper для выполнения сопоставления моего DTO с моей сущностью:

public class ProductProfile : Profile
{
    public ProductProfile()
    {
        CreateMap<Product, ProductDTO>()
            .ForMember(dest => dest.Feature, opt => opt.MapFrom(src => src.ProductFeature.Select(y => y.Feature).ToList()));
        CreateMap<ProductDTO, Product>()
            .ForMember(dest => dest.ProductName, opt => opt.MapFrom(src => src.ProductName))
            .ForMember(dest => dest.ProductFeatures, opt => opt.MapFrom(src => src.Features))
            .AfterMap((src, dest) =>{
                foreach(var pf in dest.ProductFeatures)
                {
                    pf.ProductId = src.Id;
                }
            });
        CreateMap<Feature, ProductFeature>()
            .ForMember(dest=>dest.FeatureId,opt=>opt.MapFrom(src=>src.Id))
            .ForMember(dest=>dest.Feature,opt=>opt.MapFrom(src=>src));
    }
}

Если я хочу добавить новый Products, мне нужно сопоставить ProductDTO Product и вручную выполнить итерацию по дочернему объекту Feature, чтобы определить, присутствует ли дочерняя сущность в контексте или нет, а затем создать новую сущность, включающую отношения, или обновить существующую.

Если мои сущности имеют несколько отношений «многие ко многим», мои методы становятся очень длинными. Есть ли более умный способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...