繁体   English   中英

配置文件的自动映射器问题

[英]Automapper Issues with Profiles

我正在使用Autofac和Automapper,我有以下Domain类:

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 partial class Carreras
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Carreras()
    {
        Alumnos = new HashSet<Alumnos>();
    }

    public int Id { get; set; }

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

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Alumnos> Alumnos { get; set; }
}

public partial class Turnos
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Turnos()
    {
        Alumnos = new HashSet<Alumnos>();
    }

    public int Id { get; set; }

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

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Alumnos> Alumnos { get; set; }
}

这是我的模型:

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
}

public class CarreraModel
{
    #region Fields
    public int Id { get; set; }
    public string Descripcion { get; set; }
    #endregion
}

public class TurnoModel
{
    #region Fields
    public int Id { get; set; }
    public string Descripcion { get; set; } 
    #endregion
}

我使用以下配置文件:

public class AlumnoProfile : Profile
    {
        public AlumnoProfile()
        {
            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 => src.Turnos))
                .ForMember(d => d.Carrera, s => s.MapFrom(src => src.Carreras));

            CreateMap<AlumnoModel, Alumnos>()
                .ForMember(d => d.Id, s => s.Ignore())
                .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.Carrera, s => s.MapFrom(src => src.Carrera.Id))
                .ForMember(d => d.Turno, s => s.MapFrom(src => src.Turno.Id));

        }
    }

public class CarreraProfile : Profile
{
    public CarreraProfile()
    {
        CreateMap<Carreras, CarreraModel>()
            .ForMember(d => d.Id, s => s.MapFrom(src => src.Id))
            .ForMember(d => d.Descripcion, s => s.MapFrom(src => src.Descripcion))
            .ForAllOtherMembers(d => d.Ignore());

        CreateMap<CarreraModel, Carreras>()
            .ForMember(d => d.Id, s => s.MapFrom(src => src.Id))
            .ForAllOtherMembers(opts => opts.Ignore());

    }
}

public class TurnoProfile : Profile
{
    public TurnoProfile()
    {
        CreateMap<TurnoModel, Turnos>()
            .ForMember(d => d.Id, s => s.MapFrom(src => src.Id))
            .ForAllOtherMembers(d => d.Ignore());

        CreateMap<Turnos, TurnoModel>()
            .ForMember(d => d.Id, s => s.MapFrom(src => src.Id))
            .ForMember(d => d.Descripcion, s => s.MapFrom(src => src.Descripcion))
            .ForAllOtherMembers(d => d.Ignore());



    }
}

这就是我使用AutoFac的方式:

builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile));

            builder.Register(c => new MapperConfiguration
            (cfg =>
            {
                foreach (var profile in c.Resolve<IEnumerable<Profile>>())
                {
                    cfg.AddProfile(profile);
                }
            }
            )).AsSelf().SingleInstance();

            builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();

当我试图从模型映射到领域类时,我遇到了问题(保存数据)

Unmapped members were found. Review the types and members below.
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters
==============================================================
AlumnoModel -> Alumnos (Destination member list)
Prog_II.Data.Model.AlumnoModel -> Prog_II.Data.Domain.Alumnos (Destination member list)

Unmapped properties:
Carreras
Turnos

我尝试使用Memberlist.Source并为每个属性执行以下操作:

.ForSourceMember(d => d.property, opt => opt.Ignore())

我尝试使用.ForAllOtherMembers(opt => opt.Ignore())

唯一可行的方法是调用其他2个模型的Mapper.Map,例如,如果我想将AlumnoModel映射到Alumnos

    public Alumnos FromModelToDomain_Alumnos(AlumnoModel alumno)
    {
        return _Mapper.Map<Alumnos>(alumno);
    }

但为了工作,我必须添加以下几行:

public Alumnos FromModelToDomain_Alumnos(AlumnoModel alumno)
{
    FromModelToDomain_Turno(alumno.Turno);
    FromModelToDomain_Carrera(alumno.Carrera);
    return _Mapper.Map<Alumnos>(alumno);
}

public Turnos FromModelToDomain_Turno(TurnoModel turno)
{
    return _Mapper.Map<Turnos>(turno);
}

public Carreras FromModelToDomain_Carrera(CarreraModel carrera)
{
    return _Mapper.Map<Carreras>(carrera);
}

因为必须映射它们,这才有意义。

当我这样做时,它将引发另一个错误:

Unmapped members were found. Review the types and members below.
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters
============================================================
TurnoModel -> Turnos (Destination member list)
Prog_II.Data.Model.TurnoModel -> Prog_II.Data.Domain.Turnos (Destination member list)

Unmapped properties:
Alumnos

这是因为Turnos有一个HashSet Alumnos (域类),因为表(EF 5)之间的1到n的关系,但我想此属性被忽略,因为我没有它在我的模型。

您的映射配置对我来说有点奇怪-您正在为名称匹配的单个属性进行显式映射,但是忽略了其他所有内容? 这将告诉AutoMapper“仅具有这两个属性,而没有其他”,这似乎很奇怪,为什么还要使用AutoMapper?

看来您可能想查看反向映射:

http://docs.automapper.org/en/stable/Reverse-Mapping-and-Unflattening.html

那可能更接近您要达到的目标。 忽略的意思是“不要映射此字段”,我认为您不希望这样做吗?

暂无
暂无

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

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