【问题标题】:Many-to-many to DTOs using Automapper使用 Automapper 对 DTO 进行多对多
【发布时间】:2013-01-21 14:59:13
【问题描述】:

如果我在 EF 中定义了多对多关系:

public class StudentImage 
{
    public int StudentId { get; set; }
    public int ImageId { get; set; }
    public int Order { get; set; }
    public virtual Student Student { get; set; }
    public virtual Image Image { get; set; }
}

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<StudentImage> Images { get; set; }
}


public class Image
{
    public int Id { get; set; }
    public string Filename { get; set; }
    public virtual ICollection<StudentImage> Students { get; set; }
}

还有 DTO:

 public class ImageDTO
    {
        public int Id { get; set; }
        public string Filename { get; set; }
        public int Order { get; set; }
    }

    public class StudentIDO
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<ImageDTO> Images { get; set; }
    }

如何使用 Automapper 从 Student 映射到 StudentDTO 以及从 Image 映射到 ImageDTO?

【问题讨论】:

    标签: entity-framework many-to-many automapper dto


    【解决方案1】:

    映射

    Mapper.CreateMap<Student, StudentIDO>();
    
    Mapper.CreateMap<StudentImage, ImageDTO>()
            .ForMember(d => d.Id, opt => opt.MapFrom(s => s.ImageId))
            .ForMember(d => d.Filename, opt => opt.MapFrom(s => s.Image.Filename));
    
    Mapper.CreateMap<StudentIDO, Student>()
          .AfterMap((s, d) =>
          {
              foreach (var studentImage in d.Images)
                  studentImage.StudentId = s.Id;
          });
    
    Mapper.CreateMap<ImageDTO, StudentImage>()
          .ForMember(d => d.ImageId, opt => opt.MapFrom(s => s.Id));
    

    用法

    var studentDTO = Mapper.Map<StudentIDO>(student);
    var student = Mapper.Map<Student>(studentDTO);
    

    【讨论】:

    • 我将键类型从 int 更改为 Guid,现在出现 Automapper 异常:缺少类型映射配置或不支持的映射 Guid -> Int32、System.Guid -> System.Int32。目标路径:StudentIDO.Id.Id。我唯一的 int 字段是 Order。
    • @EduardoBrites 这是因为 Guid 不能映射到 int。您期望458D34DC-5524-47F8-8507-F5AB9234063B 的整数值是多少?将您的 DTO id 类型更改为 Guid
    • 第一个映射(从Student到StudentDTO)就可以了,但是在相反的映射中(从StudentDTO到Student),StudentImage实体的Image和Student字段为空。
    • @EduardoBrites 你有图像和学生的 id - 这应该足够了。否则会出现循环依赖问题 - 学生有图像,有学生,有图像等
    【解决方案2】:

    所以 Image 和 ImageDTO 是 1:1 的关系。AutoMappper 很容易映射

    Mapper.CreateMap<Image, ImageDTO>();
    

    Mapper.CreateMap(); 最后一个 Student 和 StudentDTO,它们都有包含列表。

    Mapper.CreateMap<Student,StudentDTO>
    .ForMember(s => s.Images, opt=>opt.MapFrom(p=>p.Images));
    

    有时,如果您尝试这样做对性能不利。 谢谢

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 2020-05-24
      • 2017-02-14
      • 2016-04-13
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多