实体框架核心 - 使用AutoMapper映射多对多

时间:2018-01-21 13:30:09

标签: c# automapper entity-framework-core

我无法使用AutoMapper在具有多对多关系的DAO和DTO对象之间创建正确的映射。 现在我可以映射这些多对多属性,但其他属性为null。

正确的映射是什么?我看到那些型号'属性具有相同的名称和类型。 我也试图在父模型和#34; ClaseFabricante"之间创建映射。和" ClaseConstructor"。我应该与那些与多对多相关的孩子一起制作" ReferenciaFabricante"和" ReferenciaConstructor"与ForMember()?

实体:

[Table("ReferenciasFabricante", Schema = "public")]
public class ReferenciaFabricante
{

    public string NombreFabricante { get; set; }

    public string RefFabricanteIA { get; set; }

    [InverseProperty("ReferenciaFabricante")]
    public virtual ClaseFabricante Clase { get; set; }

    [InverseProperty("ReferenciaFabricante")]
    public virtual IList<ReferenciaFabricanteTieneReferenciaConstructor> MontaReferenciasConstructor { get; set; }

}

[Table("ReferenciasConstructor", Schema = "public")]
public class ReferenciaConstructor
{

    public string Referencia { get; set; }

    public string NombreConstructor { get; set; }

    [InverseProperty("ReferenciaConstructor")]
    public virtual ClaseConstructor Clase { get; set; }

    [InverseProperty("ReferenciaConstructor")]
    public virtual IList<ReferenciaFabricanteTieneReferenciaConstructor> MontadaPorReferenciasFabricante { get; set; }

}

[Table("ReferenciaFabricanteTieneReferenciaConstructor", Schema = "public")]
public class ReferenciaFabricanteTieneReferenciaConstructor {

    [Key]
    public int IdReferenciaFabricante { get; set; }

    [ForeignKey("IdReferenciaFabricante")]
    public ReferenciaFabricante ReferenciaFabricante { get; set; }

    [Key]
    public int IdReferenciaConstructor { get; set; }

    [ForeignKey("IdReferenciaConstructor")]
    public ReferenciaConstructor ReferenciaConstructor { get; set; }
}

[Table("ClasesFabricante", Schema = "public")]
public class ClaseFabricante
{

    public int? IdReferenciaFabricante { get; set; }

    [ForeignKey("IdReferenciaFabricante")]
    public ReferenciaFabricante ReferenciaFabricante { get; set; }

}

[Table("ClasesConstructor", Schema = "public")]
public class ClaseConstructor
{

    public int? IdReferenciaConstructor { get; set; }

    [ForeignKey("IdReferenciaConstructor")]
    public ReferenciaConstructor ReferenciaConstructor { get; set; }

}

的ViewModels:

public class ReferenciaFabricante {

    public string NombreFabricante { get; set; }

    public string RefFabricanteIA { get; set; }

    public virtual ClaseFabricante Clase { get; set; }

    public virtual IList<ReferenciaConstructor> ReferenciasConstructor { get; set; }
}

public class ReferenciaConstructor {

    public string Referencia { get; set; }

    public string NombreConstructor { get; set; }

    public virtual ClaseConstructor Clase { get; set; }

    public virtual IList<ReferenciaFabricante> ReferenciasFabricante { get; set; }
}

public class ClaseFabricante {

    public ReferenciaFabricante ReferenciaFabricante { get; set; }

}

public class ClaseConstructor {

    public ReferenciaConstructor ReferenciaConstructor { get; set; }

}

映射器初始化:

Mapper.Initialize((config) => {

    config.CreateMap<ApplicationCore.Entities.ReferenciaFabricante, ApplicationCore.ViewModels.ReferenciaFabricante>()
    ;

    config.CreateMap<ApplicationCore.Entities.ReferenciaConstructor, ApplicationCore.ViewModels.ReferenciaConstructor>()
    ;

    config.CreateMap<ApplicationCore.Entities.ClaseFabricante, ApplicationCore.ViewModels.ClaseFabricante>()
            .ForPath(dto => dto.ReferenciaFabricante.ReferenciasConstructor, opt => opt.MapFrom(x => x.ReferenciaFabricante.MontaReferenciasConstructor.Select(y => y.ReferenciaConstructor).ToList()))
            .ForPath(dto => dto.ReferenciaFabricante.VersionesVehiculo, opt => opt.MapFrom(x => x.ReferenciaFabricante.MontaVersionesVehiculo.Select(y => y.VersionVehiculo).ToList()))
    ;

    config.CreateMap<ApplicationCore.Entities.ClaseConstructor, ApplicationCore.ViewModels.ClaseConstructor>()
            .ForPath(dto => dto.ReferenciaConstructor.ReferenciasFabricante, opt => opt.MapFrom(x => x.ReferenciaConstructor.MontadaPorReferenciasFabricante.Select(y => y.ReferenciaFabricante).ToList()))                
    ;            

});

代码:

foreach (ApplicationCore.Entities.ClaseFabricante cfDAO in vClasesFabricante) {

    result.Add(AutoMapper.Mapper.Map<ApplicationCore.ViewModels.ClaseFabricante>(cfDAO));                                
}

0 个答案:

没有答案