在某些情况下,需要从我们的存储库返回复合DTO,其中DTO只有一些属性是Model属性,而DTO的功能只是一个简单的复合对象(返回一个Queryable不是因为有比T更多的信息
例如:
型号:
public class Job
{
int Id { get; set; }
//more properties
}
public class JobApplication
{
int Id { get; set; }
//more properties
}
存储库:
IQueryable<JobAndUserApplication> GetJobAndMatchingUserApplication(int userId)
:
public class JobAndUserApplication
{
public Job Job { get; set; }
public JobApplication JobApplication { get; set; }
}
现在 - 我喜欢简单地做(Project和To是Automapper功能):
//this allows one efficient query to bring in the subproperties of the composite DTO
var jobVmList = jobRepository.GetAllJobsAndMatchingJobApplicationByUser(userId)
.Project()
.To<JobVM>()
.ToList();
所以我需要这样的映射:
Mapper.CreateMap<JobAndUserApplication, JobVM>()
.ForMember(jvm => jvm, opt => opt.ResolveUsing(src => src.Job));
//many other .ForMembers that are not relevant right now
我正在尝试将DTO的Job属性直接映射到JobVM(它共享许多相同的属性)。
我的映射会引发以下异常:
成员的自定义配置仅支持某种类型的顶级个人成员。
我做错了什么,如何在JobVM本身上完成DTO的Job属性的映射?
由于
答案 0 :(得分:1)
Automapper告诉您,您只能在类的成员(属性)上定义自定义操作,而不能在类本身上定义。您需要做的是首先创建Job to JobVM地图:
Mapper.CreateMap<Job, JobVM>()
和
Mapper.CreateMap<JobAndUserApplication, JobVM>()
确保忽略并设置两种类型的任何重复属性。然后首先从子对象运行两次automapper:
var jobVM = Mapper.Map<Job, JobVM>(jobAndUserApplication.job);
然后从父对象
Mapper.Map<JobAndUserApplication, JobVM>(jobAndUserApplication, jobVM );
或者相反,取决于您的属性的布局方式。
快速注意:我有一种感觉,你可能会混淆问题,我的代码味道警报正在消失。我将再次查看您的viewmodel或域模型,因为这不是我看到的典型问题。 (只是我的0.02美元: - )