У меня есть три сущности, 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
, чтобы определить, присутствует ли дочерняя сущность в контексте или нет, а затем создать новую сущность, включающую отношения, или обновить существующую.
Если мои сущности имеют несколько отношений «многие ко многим», мои методы становятся очень длинными. Есть ли более умный способ сделать это?