如何使用自动映射器将具有多对多关系的 DTO 映射到具有 table 关系的 EF 核心实体?
How to map a DTO with a many-to-many relationship to a EF core entity with a relationship table using automapper?
我的数据库中有两个实体。 A 和 B。我也有关系 table 表示这些实体 AB 之间的多对多关系:
public class A
{
public ICollection<AB> ABs { get; set; }
}
public class B
{
public ICollection<AB> ABs { get; set; }
}
public class AB
{
public A A { get; set; }
public B B { get; set; }
}
现在我想像这样在我的 dto 中隐藏这个关系 table:
public class ADTO
{
public ICollection<B> Bs { get; set; }
}
我想要一个 B 的集合,我的实例直接表示,而不是关系 table。我想要一个自动映射器配置文件,该配置文件从实体 B 列表映射到以前不存在的实体 AB 列表,其中 B 作为属性,以及实例 A 本身。
我已经实现了从 A 到 ADTO 的映射器,如下所示:
public class AProfile : Profile
{
public AProfile()
{
CreateMap<A, ADTO>()
.ForMember(dest => dest.B, opt => opt.MapFrom(src => src.AB.Select(y => y.B).ToList()));
CreateMap<ADTO, A>();
}
}
我缺少的是相反的方向:从 ADTO 及其实体列表到 A 及其对关系 table 实体的引用。
像下面这样制作你的个人资料:
CreateMap<ADTO, A>()
.ForMember(dest => dest.AName, opt => opt.MapFrom(src => src.AName))
.ForMember(dest => dest.ABs, opt => opt.MapFrom(src => src.Bs))
.AfterMap((src, dest) =>{
foreach(var b in dest.ABs)
{
b.AId = src.Id;
}
});
CreateMap<B, AB>()
.ForMember(dest=>dest.BId,opt=>opt.MapFrom(src=>src.Id))
.ForMember(dest=>dest.B,opt=>opt.MapFrom(src=>src));
我的数据库中有两个实体。 A 和 B。我也有关系 table 表示这些实体 AB 之间的多对多关系:
public class A
{
public ICollection<AB> ABs { get; set; }
}
public class B
{
public ICollection<AB> ABs { get; set; }
}
public class AB
{
public A A { get; set; }
public B B { get; set; }
}
现在我想像这样在我的 dto 中隐藏这个关系 table:
public class ADTO
{
public ICollection<B> Bs { get; set; }
}
我想要一个 B 的集合,我的实例直接表示,而不是关系 table。我想要一个自动映射器配置文件,该配置文件从实体 B 列表映射到以前不存在的实体 AB 列表,其中 B 作为属性,以及实例 A 本身。
我已经实现了从 A 到 ADTO 的映射器,如下所示:
public class AProfile : Profile
{
public AProfile()
{
CreateMap<A, ADTO>()
.ForMember(dest => dest.B, opt => opt.MapFrom(src => src.AB.Select(y => y.B).ToList()));
CreateMap<ADTO, A>();
}
}
我缺少的是相反的方向:从 ADTO 及其实体列表到 A 及其对关系 table 实体的引用。
像下面这样制作你的个人资料:
CreateMap<ADTO, A>()
.ForMember(dest => dest.AName, opt => opt.MapFrom(src => src.AName))
.ForMember(dest => dest.ABs, opt => opt.MapFrom(src => src.Bs))
.AfterMap((src, dest) =>{
foreach(var b in dest.ABs)
{
b.AId = src.Id;
}
});
CreateMap<B, AB>()
.ForMember(dest=>dest.BId,opt=>opt.MapFrom(src=>src.Id))
.ForMember(dest=>dest.B,opt=>opt.MapFrom(src=>src));