如何在AutoMapper中处理关系实体映射?

时间:2015-04-01 20:00:44

标签: entity-framework automapper

我们的实体模型具有导航属性:

public class Course
{
    public Guid Id { get; set; }

    ...

    public Guid InstructorId { get; set; }
    public virtual Instructor Instructor { get; set; }

    public virtual ICollection<Instructor> Coinstructors { get; set; }
}

也就是说,一门课程有一个教练和多个硬币结构。

我的视图模型具有这些教师的身份。

public class CourseCreateModel
{
    ...
    public InstructorModel Instructor { get; set; }
    public IEnumerable<InstructorModel> Coinstructors { get; set; }
}

InstructorModel包含Id

 public class InstructorModel
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

要将数据从我们的DTO CourseCreateModel传输到域模型Course,我们可以轻松映射教师,因为域模型中有InstructorId

Mapper.CreateMap<CourseCreateModel, Course>()
    .ForMember(dest => dest.InstructorId, opts => opts.MapFrom(src => src.Instructor.Id))

    ...;

但是如何映射Coinstructors?我们可以获得一系列moneytructor的id。但是如何进行映射?

1 个答案:

答案 0 :(得分:0)

我相信你有两个选择:

选项nr。 1:

.ForMember(c=>c.Coinstructors,op=>op.MapFrom(v=>v.Coinstructorids.Select(c=>new Instructor(){Id=c})))

其中Coinstructorids = List<int>();

选项nr。 2:

创建自定义解析器:

public class CustomConvert : ValueResolver<IList<int>, IList<Instructor>>
    {
        protected override string ResolveCore(IList<int> source)
        {
            string result = new List<Instructor>();
            foreach (var item  in source)
            {
                result.Add(new Instructor() {Id = item});
            }
            return result;
        }
    }

并使用它:

 .ForMember(c => c.Coinstructors, op => op.ResolveUsing<CustomConvert>().FromMember(c => c.Coinstructorids));

其中Coinstructorids = List<int>();