所以我是使用AutoMapper的新手,并且能够使用不使用.Include(" blah")的LINQ语句获得项目的基本映射,但是当我有一个语句时例如像这样;
var courses = dc.Courses.Include("Students")
.Include("CourseTimes")
.OrderBy(n=>n.CourseSemester.courseStart);
AutoMapper似乎不会从("学生")或(" CourseTimes")中提取任何信息。我的对象发布在下面,并提供快速分类,课程包含学生列表(我需要学生,所以我可以计算每门课程的人数),课程还包含课程时间列表(所以我可以显示时间给定课程的每个班级)。这是我正在使用的ViewModel。
public class UserIndexCourseList
{
[Key]
public int courseId { get; set; }
public string courseCode { get; set; }
public string courseName { get; set; }
// this simply stored a count when I did Students.Count without using AutoMapper
public int size { get; set; }
public string room { get; set; }
public List<CourseTime> courseTimeSlot { get; set; }
}
以下是我尝试使用的一些AutoMapper语句,但没有运气。
//to the viewmodel
Mapper.CreateMap<Models.Course, ViewModels.UserIndexCourseList>();
Mapper.CreateMap<Models.CourseTime, ViewModels.UserIndexCourseList>();
Mapper.CreateMap<Models.Student, ViewModels.UserIndexCourseList>();
//from the viewmodel
Mapper.CreateMap<ViewModels.UserIndexCourseList, Models.Course>();
Mapper.CreateMap<ViewModels.UserIndexCourseList, Models.CourseTime>();
Mapper.CreateMap<ViewModels.UserIndexCourseList, Models.Student>();
所以基本上我如何创建一个Map,它也会提取所有这些信息,以便我可以将它与我上面发布的ViewModel一起使用?我尝试了很多选择,但没有运气。
我为提前作出的类似帖子道歉,但我不认为我第一次解释得很好。再次感谢!
答案 0 :(得分:1)
按照惯例,automapper映射具有相同名称的属性,因此在您的情况下,您可以执行此操作:
public class UserIndexCourseList
{
...
//rename field so it has same name as reference
public List<CourseTime> CourseTimes{ get; set; }
}
或者您可以在EF中重命名引用,因此它的名称是courseTimeslot。
如果您不想重命名您的媒体资源,另一种解决方案是添加地图选项,例如:
Mapper.CreateMap<Models.Course, ViewModels.UserIndexCourseList>()
.ForMember(d => d.courseTimeSlot,
opt => opt.MapFrom(src => src.CourseTime));
编辑:他们也有很好的文档,您的案例在此处描述:https://github.com/AutoMapper/AutoMapper/wiki/Projection
&#34;因为目标属性的名称与源属性不完全匹配(CalendarEvent.Date需要是CalendarEventForm.EventDate),我们需要在类型映射配置中指定自定义成员映射。 &#34;