C# 自动映射多对一映射配置
我想将3个不同的类映射到一个DTO中,每个属性在源和目标上具有相同的名称,这些类如下所示:C# 自动映射多对一映射配置,c#,mapping,automapper,automapper-3,C#,Mapping,Automapper,Automapper 3,我想将3个不同的类映射到一个DTO中,每个属性在源和目标上具有相同的名称,这些类如下所示: 使用者 候选人 投资组合 这是DTO以及我希望映射对象的方式: public class CandidateTextInfo { public string ProfilePicture { get; set; } //-->User public ObjectId UserId { get; set; } //-->User
- 使用者
- 候选人
- 投资组合
public class CandidateTextInfo
{
public string ProfilePicture { get; set; } //-->User
public ObjectId UserId { get; set; } //-->User
public string Name { get; set; } //--> Candidate
public string Headline { get; set; } //--> Candidate
public Gender Gender { get; set; } //--> Candidate
public byte Rating { get; set; } //--> Candidate
public bool IsCompany { get; set; } //--> Candidate
public string[] Tags { get; set; } //--> Portafolio
public string[] Categories { get; set; } //--> Portafolio
public string ExecutiveSummary { get; set; } //--> Portafolio
public HourlyRate HourlyRate{ get; set; } //--> Candidate
}
我一直在寻找,所以我找到了这个解决方案,但我没有得到的方法
因此,如果没有任何解决方法,我如何实现多对一映射呢?Automapper的ConstructUsing对于从自定义代码构建一个属性非常有用。在你的情况下,这不是真的必要。您只需要创建从对象到DTO的映射。然后将每个对象实例映射到相同的DTO实例 但是,由于Automapper希望定义目标对象的每个属性,以确保完全指定目标,因此您需要将源对象中不存在的属性配置为忽略
CreateMap<Candidate, CandidateTextInfo>()
.ForMember(x=> x.ProfilePicture, opt => opt.Ignore())
.ForMember(...
// repeat for all destination properties not existing in source properties
CreateMap()
.ForMember(x=>x.ProfilePicture,opt=>opt.Ignore())
.ForMember(。。。
//对源属性中不存在的所有目标属性重复此操作
如果这是太多的样板代码,那么会有很多关于堆栈溢出的解决方案,其中有一个看起来很有希望:(看看Robert Schroeder的答案)这在很大程度上取决于对象之间的关系。如果对象之间的关系为1:1(例如,如果
User
具有属性User.Candidate
和User.Portfolio
),则映射很容易:-
CreateMap<User, CandidateTextInfo>()
.ForMember(d => d.ProfilePicture, o => o.MapFrom(s => s.ProfilePicture)
// ...
.ForMember(d => d.Name, o => o.MapFrom(s => s.Candidate.Name)
// And so on...
我知道这个答案已经很晚了,但是如果你进一步指定对象之间的关系,我可以帮助你创建一个更具体的映射。这些类是如何关联的?它们相互引用吗?你可以根据命名约定使用AutoMapper的展平。它们之间有共同的id,但只有yo make“逻辑”关系,它们之间没有对象或嵌套引用
public class CandidateTextInfoSource
{
public CandidateTextInfoSource(User user,
Candidate candidate,
Portafolio portafolio)
{
this.User = user;
this.Candidate = candidate;
this.Portafolio = portafolio;
}
public User User { get; set; }
public Candidate Candidate { get; set; }
public Portafolio Portafolio { get; set; }
}
// ...
CreateMap<CandidateTextInfoSource, CandidateTextInfo>()
.ForMember(d => d.ProfilePicture, o => o.MapFrom(s => s.User.ProfilePicture)
// ...
.ForMember(d => d.Name, o => o.MapFrom(s => s.Candidate.Name)
// And so on...
CreateMap<User, IEnuemerable<CandidateTextInfoSource>>()
.ConstructUsing(
x => x.Candidates
.Select(y => Mapper.Map<CandidateTextInfo>(new CandidateTextInfoSource(x, y, y.Portfolio)))
.ToList());