Entity framework Automapper EF6映射具有复杂主键的嵌套实体(2列)

Entity framework Automapper EF6映射具有复杂主键的嵌套实体(2列),entity-framework,automapper,Entity Framework,Automapper,我对Automapper有点陌生,我已经为此挣扎了几天,我真的非常感谢任何帮助解决这个问题。我也一直在努力寻找一些对我有帮助的帖子,但我找不到任何类似的情况 我有一个主要实体: public partial class cht_cotizacion { public cht_cotizacion() { this.cht_cotizacion_opcion = new List<cht_cotizacion_opcion>(); } [

我对Automapper有点陌生,我已经为此挣扎了几天,我真的非常感谢任何帮助解决这个问题。我也一直在努力寻找一些对我有帮助的帖子,但我找不到任何类似的情况

我有一个主要实体:

public partial class cht_cotizacion
{
    public cht_cotizacion()
    {
        this.cht_cotizacion_opcion = new List<cht_cotizacion_opcion>();
    }
    [DataMember]
    public long Id { get; set; }
    [DataMember]
    public string LocaleId { get; set; }
    [DataMember]
    public Nullable<int> EstatusId { get; set; }
    [DataMember]
    public virtual cht_cat_estatus cht_cat_estatus { get; set; }
    [DataMember]
    public virtual ICollection<cht_cotizacion_opcion> cht_cotizacion_opcion { get; set; }
}
实体cht\u cat\u status有一个复杂的主键,由以下内容组成:“Id”“LocaleId”,它们在cht\u cotization的列上是外来的:“EstatusId”“LocaleId”

DTO类别:

[DataContract()]
public partial class cht_cotizacionDTO
{
    public cht_cotizacionDTO()
    {
    }

    [DataMember()]
    public Int64 Id { get; set; }

    [DataMember()]
    public String LocaleId { get; set; }

    [DataMember()]
    public Nullable<Int32> EstatusId { get; set; }

    [DataMember()]
    public List<cht_cat_estatusDTO> cht_cat_estatus { get; set; }

    [DataMember()]
    public List<cht_cotizacion_opcionDTO> cht_cotizacion_opcion { get; set; }
}

[DataContract()]
public partial class cht_cotizacion_opcionDTO
{
    public cht_cotizacion_opcionDTO()
    {
    }

    [DataMember()]
    public Int64 Id { get; set; }

    [DataMember()]
    public String LocaleId { get; set; }

    [DataMember()]
    public Int64 CotizacionId { get; set; }

    [DataMember()]
    public Int32 TipoOpcionId { get; set; }

    [DataMember()]
    public DateTime FechaOpcion { get; set; }

    [DataMember()]
    public Int64 cht_cotizacion_Id { get; set; }
}

[DataContract()]
public partial class cht_cat_estatusDTO
{
    public cht_cat_estatusDTO()
    {
    }

    [DataMember()]
    public Int32 Id { get; set; }

    [DataMember()]
    public String LocaleId { get; set; }

    [DataMember()]
    public String Descripcion { get; set; }

    [DataMember()]
    public List<Int64> cht_cotizacion_Id { get; set; }
}

你能不能先帮我们(和你自己)一个忙,去掉这些无用的前缀?它们使代码不必要地难以阅读。此外,强烈建议使用标准命名约定,如CamelCase类和属性名称、集合的复数名称以及标量属性和引用的单数名称。这在使用名称约定驱动的工具(如AutoMapper)时尤其重要。很可能在执行此操作时,您会看到AutoMapper在解析名称映射时遇到问题的原因。我怀疑它试图在不可能的地方执行扁平化。当然@GertArnold,我完全明白你的意思,对我来说很遗憾,这是一个现有的项目,他们决定使用这种名称约定,如果可以这样称呼的话。出于测试目的,我将尝试将所有模型名称约定更改为更有用的内容,但现在我需要一些提示,说明如何使用Automapper映射具有复杂主键的实体,如果可能的话。好的,这就是生活。还请注意,AutoMapper不知道类模型中的任何主键概念。它只是尝试映射匹配的名称和显式映射规范。
[DataContract(IsReference = true)]
public partial class cht_cotizacion_opcion
{
    [DataMember]
    public long Id { get; set; }
    [DataMember]
    public string LocaleId { get; set; }
    [DataMember]
    public long CotizacionId { get; set; }
    [DataMember]
    public int TipoOpcionId { get; set; }
    [DataMember]
    public System.DateTime FechaOpcion { get; set; }
    [DataMember]
    public virtual cht_cotizacion cht_cotizacion { get; set; }
}
[DataContract()]
public partial class cht_cotizacionDTO
{
    public cht_cotizacionDTO()
    {
    }

    [DataMember()]
    public Int64 Id { get; set; }

    [DataMember()]
    public String LocaleId { get; set; }

    [DataMember()]
    public Nullable<Int32> EstatusId { get; set; }

    [DataMember()]
    public List<cht_cat_estatusDTO> cht_cat_estatus { get; set; }

    [DataMember()]
    public List<cht_cotizacion_opcionDTO> cht_cotizacion_opcion { get; set; }
}

[DataContract()]
public partial class cht_cotizacion_opcionDTO
{
    public cht_cotizacion_opcionDTO()
    {
    }

    [DataMember()]
    public Int64 Id { get; set; }

    [DataMember()]
    public String LocaleId { get; set; }

    [DataMember()]
    public Int64 CotizacionId { get; set; }

    [DataMember()]
    public Int32 TipoOpcionId { get; set; }

    [DataMember()]
    public DateTime FechaOpcion { get; set; }

    [DataMember()]
    public Int64 cht_cotizacion_Id { get; set; }
}

[DataContract()]
public partial class cht_cat_estatusDTO
{
    public cht_cat_estatusDTO()
    {
    }

    [DataMember()]
    public Int32 Id { get; set; }

    [DataMember()]
    public String LocaleId { get; set; }

    [DataMember()]
    public String Descripcion { get; set; }

    [DataMember()]
    public List<Int64> cht_cotizacion_Id { get; set; }
}
var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<cht_cotizacion, cht_cotizacionDTO>()
    //cfg.CreateMap<cht_cat_estatus, cht_cat_estatusDTO>();
    cfg.CreateMap<cht_cotizacion_opcion, cht_cotizacion_opcionDTO>();
});

IMapper mapper = config.CreateMapper();
var source = cotizacion;
cotizacionDTO = mapper.Map<cht_cotizacion, cht_cotizacionDTO>(source);
cfg.CreateMap<cht_cat_estatus, cht_cat_estatusDTO>();
cfg.CreateMap<cht_cotizacion, cht_cotizacionDTO>()
    .ForMember(dest => dest.cht_cat_estatus, opt => opt.MapFrom(src => src.cht_cat_estatus));
{"Error mapping types.
    Mapping types:
        cht_cotizacion -> cht_cotizacionDTO
        cht_cotizacion -> cht_cotizacionDTO
    Type Map configuration:
        cht_cotizacion -> cht_cotizacionDTO
        cht_cotizacion -> cht_cotizacionDTO
    Property:
        cht_cat_estatus"
}