关于此主题的以下不同问题/ 答案我在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
答案 0 :(得分:-1)
好的,我找到了一个解决方案,也许它有点笨重,但它完成了这项工作:
Alumnos
我不明白为什么初始化其他域名不起作用。
在这里,我们告诉Automapper,每当您想要映射Turnos
并且在其中找到Carreras
和.CreateMap
时,请使用上面的{{1}}来解决它。
你必须在Initialize内部(在将要映射的内容的实例内部)。