自动映射映射会发出子对象属性

时间:2017-11-10 15:20:26

标签: c# automapper

关于此主题的以下不同问题/ 答案我在2天前开始使用AutoMapper时遇到了困难。

这是我的模特(前面):

public class AlumnoModel
{
    #region Fields
    public int Id { get; set; }
    public string Nombre { get; set; }
    public string Apellido { get; set; }
    public string Legajo { get; set; }
    public int Dni { get; set; }
    public TurnoModel Turno { get; set; }
    public CarreraModel Carrera { get; set; }
    #endregion
}

这是我的域名(由EF创建,首先使用本地数据库创建代码)

public partial class Alumnos
{
    public int Id { get; set; }

    [Required]
    [StringLength(50)]
    public string Nombre { get; set; }

    [Required]
    [StringLength(50)]
    public string Apellido { get; set; }

    [Required]
    [StringLength(50)]
    public string Legajo { get; set; }

    public int Dni { get; set; }

    public int Carrera { get; set; }

    public int Turno { get; set; }

    public virtual Carreras Carreras { get; set; }

    public virtual Turnos Turnos { get; set; }
}

这就是我试图映射它们的方式:

public Alumnos FromModelToDomain_Alumnos(AlumnoModel alumno)
{
    Mapper.Initialize(cfg =>
    {
        cfg.CreateMap<Alumnos, AlumnoModel>()
        .ForMember(d => d.Nombre, s => s.MapFrom(src => src.Nombre))
        .ForMember(d => d.Apellido, s => s.MapFrom(src => src.Apellido))
        .ForMember(d => d.Legajo, s => s.MapFrom(src => src.Legajo))
        .ForMember(d => d.Dni, s => s.MapFrom(src => src.Dni))
        .ForMember(d => d.Turno, s => s.MapFrom(src => new Carreras
            {
                Id = src.Turnos.Id,
                Descripcion = src.Turnos.Descripcion
            }))
        .ForMember(d => d.Carrera, s => s.MapFrom(src => new Turnos
            {
                Id = src.Carreras.Id,
                Descripcion = src.Carreras.Descripcion
            }))
        .ForMember(d => d.Carrera.Id, s => s.MapFrom(src => src.Carrera))
        .ForMember(d => d.Turno.Id, s => s.MapFrom(src => src.Turno));
    });

    return Mapper.Map<Alumnos>(alumno);
}

这是例外的消息:

Expression 'd => d.Carrera.Id' must resolve to top-level member and not any child object's properties. Use a custom resolver on the child type or the AfterMap option instead.
Parameter name: lambdaExpression.

我会阅读更多有关AfterMap的内容,但我认为创建一个新的子项并填充其属性就足以进行映射。

修改

好的,我对mapper方法进行了一些更改,它看起来像这样:

public Alumnos FromModelToDomain_Alumnos(AlumnoModel alumno)
{
    Mapper.Initialize(cfg =>
    {
        cfg.CreateMap<AlumnoModel, Alumnos>()
        .ForMember(d => d.Nombre, s => s.MapFrom(src => src.Nombre))
        .ForMember(d => d.Apellido, s => s.MapFrom(src => src.Apellido))
        .ForMember(d => d.Legajo, s => s.MapFrom(src => src.Legajo))
        .ForMember(d => d.Dni, s => s.MapFrom(src => src.Dni))
        .ForMember(d => d.Turnos, s => s.MapFrom(src => new Carreras
        {
            Id = src.Turno.Id,
        }))
        .ForMember(d => d.Carreras, s => s.MapFrom(src => new Turnos
        {
            Id = src.Carrera.Id,
        }))
        .ForMember(d => d.Carrera, s => s.MapFrom(src => src.Carrera.Id))
        .ForMember(d => d.Turno, s => s.MapFrom(src => src.Turno.Id));
    });

    return Mapper.Map<Alumnos>(alumno);
}

如果我把new从那里取出它有效但当然这些属性将是emtpy。

例外消息:

Error mapping types.

Mapping types:
AlumnoModel -> Alumnos
Prog_II.Models.AlumnoModel -> Repository.Domain.Alumnos

Type Map configuration:
AlumnoModel -> Alumnos
Prog_II.Models.AlumnoModel -> Repository.Domain.Alumnos

Property:
Turnos

1 个答案:

答案 0 :(得分:-1)

好的,我找到了一个解决方案,也许它有点笨重,但它完成了这项工作:

Alumnos

我不明白为什么初始化其他域名不起作用。 在这里,我们告诉Automapper,每当您想要映射Turnos并且在其中找到Carreras.CreateMap时,请使用上面的{{1}}来解决它。

你必须在Initialize内部(在将要映射的内容的实例内部)。