【问题标题】:Automapper one-to-many relationshipAutomapper 一对多关系
【发布时间】:2021-05-24 21:55:10
【问题描述】:

我有一个创建课程的方法。课程保留教师及其 ID。但是添加课程后,TeacherID 有值,但 Teacher 有 null。我认为问题出在映射中。 CourseAddRequest 只有一个teacherID,如何添加Teacher?

添加课程:

public CourseResponse AddCourse(CourseAddRequest courseAddRequest, Guid teacherId)
        {
            var teacher = _uniDbContext.Teachers
                .Include(t => t.Courses)
                .SingleOrDefault(t => t.Id == teacherId);

            if (teacher == null)
                throw new Exception("User doesn't exist");

            var course = _mapper.Map<Course>(courseAddRequest);
            teacher.Courses.Add(course);
            _uniDbContext.Teachers.Update(teacher);
            _uniDbContext.Courses.Update(course);
            _uniDbContext.Courses.Add(course);
            _uniDbContext.SaveChanges();
            return _mapper.Map<CourseResponse>(course);
        }

课程:

public class Course : BaseEntity
    {
        public string Header { get; set; }
        public string Description { get; set; }
        public Guid TeacherId { get; set; }
        public Teacher Teacher { get; set; }

        public List<Student> StudentsOnCourse { get; set; } = new List<Student>();
    }

课程回复:

public class CourseResponse
    {
        public Guid Id { get; set; }
        public string Header { get; set; }
        public string Description { get; set; }

        public TeacherResponse Teacher { get; set; }
        public Guid TeacherId { get; set; }
        public IEnumerable<StudentResponse> Students { get; set; }
    }

课程添加请求:

public class CourseAddRequest
    {
        public string Header { get; set; }
        public string Description { get; set; }
        public Guid TeacherId { get; set; }
    }

课程简介:

public class CourseProfile : Profile
    {
        public CourseProfile()
        {
            CreateMap<CourseAddRequest, Course>();
            CreateMap<Course, CourseResponse>();
        }
    }

教师简介:

public class TeacherProfile : Profile
    {
        public TeacherProfile()
        {
            CreateMap<TeacherAddRequest, Teacher>();
            CreateMap<Teacher, TeacherResponse>();
        }
    }

【问题讨论】:

    标签: c# entity-framework automapper


    【解决方案1】:

    你猜对了。当您执行从 CourseAddRequest 到 Course 的映射时,它没有教师因此课程教授将为空。

    var course = _mapper.Map<Course>(courseAddRequest);
    

    假设您使用的是 EntityFramework 或其他 ORM,由于您在 Course 中通过 TeacherId 属性引用的 Teacher 的存在,它将能够正确插入。

    当您将课程添加到方法的第 11 行中的教师时,这仍然会使课程中的教师属性为空。结果,当您将其映射到 CourseResponse 时,您会得到 null。

    有两种方法可以解决这个问题,首先,您可以将教员添加到您的课程对象中,因此映射器会在返回语句中映射到 CourseResponse 之前找到老师。

    course.Teacher = teacher;
    

    或将教师对象直接映射到响应。

    var courseResponse = _mapper.Map<CourseResponse>(course);
    courseResponse.Teacher = _mapper.Map<TeacherResponse>(teacher);
    return courseResponse;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2020-05-24
      • 2018-08-18
      • 2018-06-15
      • 1970-01-01
      • 2018-09-27
      • 2011-03-30
      相关资源
      最近更新 更多