繁体   English   中英

AutoMapper不从相关实体返回对象

[英]AutoMapper not returning objects from related entites

我在从相关领域模型返回对象时遇到问题。 来自其他模型的对象返回null。

我基本上想完成的工作是返回一个DTO,该DTO具有我想要的相关领域模型中的字段,而不是将每个字段直接从领域模型中传递给json。

请参见下面的代码,有人可以提出建议。

屏幕显示结果 数据库图

## CourseDomainModels.cs ##

public class CourseDomainModel : IObjectWithState
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Double Duration { get; set; }
    public string Description { get; set; }

    public virtual TutorDomainModel CourseTutor { get; set; }
    public virtual SubjectDomainModel CourseSubject { get; set; }

    public ICollection<EnrollmentDomainModel> Enrollments { get; set; }

    [NotMapped]
    public Common.State state { get; set; }

    [NotMapped]
    public bool InDb => this.Id != default(int);

    public object PersistenceEntityId => this.Id;
}


## TutorDomainModel.cs ##

public class TutorDomainModel : IObjectWithState
{
    public int Id { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Enums.Gender Gender { get; set; }

    public ICollection<CourseDomainModel> Courses;

    [NotMapped]
    public Common.State state { get; set; }

    [NotMapped]
    public bool InDb => this.Id != default(int);

    public object PersistenceEntityId => this.Id;
}

## CourseDTO.cs ##

public class CourseDTO
{
    public string Name { get; set; }

    public Double Duration { get; set; }

    public string Description { get; set; }

    public string Email { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

## AutoMapperConfig.cs ##

public class AutoMapperConfig
{
    public static void RegisterMapping()
    {

        Mapper.CreateMap<CourseDomainModel, CourseDTO>();
    }
}

## Startup.cs ##

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        WebApiConfig.Register(config);
        app.UseWebApi(config);

        AutoMapperConfig.RegisterMapping();
    }
}

## CourseService.cs ##

public CourseDTO GetCourse(int id)
    {

        var course = _courseRepo.Get(id);
        CourseDTO courseView = Mapper.Map<CourseDomainModel,CourseDTO(course);

        return courseView;           
    }

AutoMapperTSource的属性映射到TDestination属性,但是默认情况下,它不会尝试从TSource的子属性中查找TDestination属性。

您可以指示AutoMapper这样做:

Mapper.CreateMap<CourseDomainModel, CourseDTO>()
    .ForMember(dest => dest.Email, opt => opt.MapFrom(src => src.CourseTutor == null ? string.Empty : src.CourseTutor.Email))
    .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.CourseTutor == null ? string.Empty : src.CourseTutor.FirstName))
    .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.CourseTutor == null ? string.Empty : src.CourseTutor.LastName));

CourseDTO courseView = Mapper.Map<CourseDTO>(course);

AutoMapper还不是AI,因此您应该显式指定自定义成员映射:

Mapper.CreateMap<CourseDomainModel, CourseDTO>()
                .ForMember(dest => dest.Email, opt => opt.MapFrom(source => source.TutorDomainModel.Email));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM