自动映射EF6映射具有复杂主键的嵌套实体(2列)

时间:2017-04-17 17:49:10

标签: entity-framework automapper

我是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_cat_estatus:

[DataContract(IsReference = true)]
public partial class cht_cat_estatus
{
    public cht_cat_estatus()
    {
        this.cht_cotizacion = new List<cht_cotizacion>();
    }

    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string LocaleId { get; set; }
    [DataMember]
    public string Descripcion { get; set; }
    [DataMember]
    public virtual ICollection<cht_cotizacion> cht_cotizacion { get; set; }
}

相关实体cht_cotizacion_opcion:

[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; }
}

实体cht_cat_status有一个由以下内容组成的复杂主键:“Id”“LocaleId”,它们在列上的cht_cotizacion上是外来的:“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; }
}

然后用法(这很好用):

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"
}

0 个答案:

没有答案