创建到外键的映射

时间:2014-09-09 14:58:26

标签: entity-framework automapper foreign-key-relationship

假设我有这个域模型:

public class Department
{
    public int DepartmentId { get; set; }
    public String DepartmentName { get; set; }
    public ICollection<Course> Courses { get; set; }
}

public class Course
{
    public String CourseName { get; set; }
    public String CourseDescription { get; set; }
}

和相对持久性模型,针对实体框架和代码优先数据库创建进行了优化:

public class DepartmentDTO
{
    public int DepartmentId { get; set; }
    public String DepartmentName { get; set; }
    public ICollection<CourseDTO> Courses { get; set; }
}

public class CourseDTO
{
    public int CourseId { get; set; }
    public int DepartmentId { get; set; }
    public String CourseName { get; set; }
    public String CourseDescription { get; set; }
}

然后我有一个测试类,我使用Automapper进行所有映射:

    static void Main(string[] args)
    {
        Department dep = CreateDepartment();

        Mapper.CreateMap<Department, DepartmentDTO>();
        Mapper.CreateMap<Course, CourseDTO>()
              .ForMember(dst => dst.CourseId, src => src.UseValue<int>(13)); // in my real scenario this is an autogenerated GUID

        DepartmentDTO depDTO = Mapper.Map<DepartmentDTO>(dep);
    }

    public static Department CreateDepartment()
    {
        ICollection<Course> listOfCourses = new List<Course>();
        listOfCourses.Add(new Course { CourseDescription = "A dummy course", CourseName = "Test Course" });
        return new Department { DepartmentId = 42, DepartmentName = "Test Department", Courses = listOfCourses };
    }

到目前为止,地图几乎已经完成,只缺少一件事:CourseDTO.DepartmentId应为42

在这种情况下,一切都很好,因为我可以通过dep.DepartmentId访问该值,但这不是真实的情况。

如何配置AutoMapper以达到我的目标?

1 个答案:

答案 0 :(得分:0)

您可以创建自定义解析程序,以便在解析DepartmentId时为每个Course设置Courses

public class CourseResolver : ValueResolver<Department, ICollection<CourseDTO>>
{
    protected override ICollection<CourseDTO> ResolveCore(Department source)
    {
        var coursesDto = source.Courses
            .Select(c => Mapper.Map<CourseDTO>(c)).ToList();
        coursesDto.ForEach(c => c.DepartmentId = source.DepartmentId);
        return coursesDto;
    }
}

配置:

 Mapper.CreateMap<Department, DepartmentDTO>()
     .ForMember(obj => obj.Courses, opt => opt.ResolveUsing<CourseResolver>());
 Mapper.CreateMap<Course, CourseDTO>();
相关问题