ICollection类型成员的AutoMapper上的“错误映射类型”错误

时间:2019-05-13 11:22:34

标签: c# entity-framework-6 automapper

尝试将DTO投射到模型时,出现以下错误消息。

MEMBER_Model model = Mapper.Map<MEMBER_Model>(item);
  

错误映射类型。

     

映射类型:T_MEMBER-> MEMBER_Model TL.CFM.DATA.T_MEMBER->   TL.CFM.CORE.MEMBER_Model

     

类型映射配置:T_MEMBER-> MEMBER_Model TL.CFM.DATA.T_MEMBER   -> TL.CFM.CORE.MEMBER_Model

     

目标成员:MEMBER_GROUP

DTO类:

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

    public decimal ID { get; set; }
    public string USERNAME { get; set; }
    public string PASSWORD { get; set; }
    public decimal IS_ACTIVE { get; set; }
    public decimal IS_DELETED { get; set; }
    public Nullable<decimal> CRE_BY { get; set; }
    public Nullable<System.DateTime> CRE_DATE { get; set; }
    public Nullable<decimal> UPD_BY { get; set; }
    public Nullable<System.DateTime> UPD_DATE { get; set; }
    public decimal PERSON_ID { get; set; }

}

模型类别:

public class MEMBER_Model : _BaseModel
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public MEMBER_Model()
    {
        this.MEMBER_GROUPs = new HashSet<MEMBER_GROUP_Model>();
    }
    public override decimal ID { get; set; }
    public string USERNAME { get; set; }
    public string PASSWORD { get; set; }
    public bool IS_ACTIVE { get; set; }
    public bool IS_DELETED { get; set; }
    public override Nullable<decimal> CRE_BY { get; set; }
    public override Nullable<DateTime> CRE_DATE { get; set; }
    public override Nullable<decimal> UPD_BY { get; set; }
    public override Nullable<DateTime> UPD_DATE { get; set; }
    public decimal PERSON_ID { get; set; }

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

    public string Fullname
    {
        get
        {
            return string.Format("{0} {1}", FIRST_NAME, LAST_NAME);
        }
    }
}

AutoMapper配置:

public static void SetAutoMapperConfs()
{
    Mapper.Initialize(cfg =>
    {
        #region MEMBER_Model -1
        cfg.CreateMap<T_MEMBER, MEMBER_Model>()
            .ForMember(d => d.MEMBER_GROUPs, f => f.MapFrom(src => src.REL_MEMBER_GROUP))
            .ReverseMap();
        #endregion

        #region MEMBER_GROUP_Model -2
        cfg.CreateMap<REL_MEMBER_GROUP, MEMBER_GROUP_Model>()
            .ForMember(d => d.AUTH_GROUP, f => f.MapFrom(src => src.LKP_AUTH_GROUP))
            .ForMember(d => d.MEMBER, f => f.MapFrom(src => src.T_MEMBER))
            .ReverseMap();
        #endregion      

        #region AUTH_GROUP_Model -3
        cfg.CreateMap<LKP_AUTH_GROUP, AUTH_GROUP_Model>()
            .ForMember(d => d.GROUP_ROLEs, f => f.MapFrom(src => src.REL_GROUP_ROLE))
            .ForMember(d => d.MEMBER_GROUPs, f => f.MapFrom(src => src.REL_MEMBER_GROUP))
            .ReverseMap();
        #endregion

        #region GROUP_ROLE_Model -4
        cfg.CreateMap<REL_GROUP_ROLE, GROUP_ROLE_Model>()
            .ForMember(d => d.AUTH_GROUP, f => f.MapFrom(src => src.LKP_AUTH_GROUP))
            .ForMember(d => d.ROLE, f => f.MapFrom(src => src.LKP_ROLE))
            .ReverseMap();
        #endregion

        #region ROLE_Model -5
        cfg.CreateMap<LKP_ROLE, ROLE_Model>()
            //.ForMember(d => d.GROUP_ROLEs, f => f.MapFrom(src => src.REL_GROUP_ROLE))
            .ReverseMap();
        #endregion
    });
}
  

#region标签上的数字显示关系流。

如您所见, #region ROLE_Model -5 带有注释行。这条线引起了问题。 (注意:我认为递归是从这里开始的,这可能会引发问题)

= UPDATED =

输出值:

  

引发的异常:“ AutoMapper.AutoMapperConfigurationException”在   AutoMapper.dll frknc:AutoMapper.AutoMapperConfigurationException:   找到未映射的成员。在下面查看类型和成员。添加一个   自定义映射表达式,忽略,添加自定义解析器或修改   源/目标类型对于没有匹配的构造函数,请添加一个无参数   ctor,添加可选参数或映射所有构造函数参数

     

================================================ =============

     

AutoMapper为您创建了此类型映射,但是您的类型不能为   使用当前配置映射。 REL_GROUP_ROLE->   MEMBER_GROUP_Model(目标成员列表)   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.MEMBER_GROUP_Model   (目标成员列表)

     

未映射的属性:ID MEMBER_ID AUTH_GROUP MEMBER

     在

  AutoMapper.ConfigurationValidator.AssertConfigurationIsValid(IEnumerable`1   (TypeMaps)引发的异常:“ AutoMapper.AutoMapperMappingException”在   AutoMapper.dll frknc:AutoMapper.AutoMapperMappingException:错误   映射类型。

     

映射类型:LKP_ROLE-> ROLE_Model TL.CFM.DATA.LKP_ROLE->   TL.CFM.CORE.ROLE_Model

     

类型映射配置:LKP_ROLE-> ROLE_Model TL.CFM.DATA.LKP_ROLE->   TL.CFM.CORE.ROLE_Model

     

目标成员:GROUP_ROLEs --->   AutoMapper.AutoMapperConfigurationException:未映射的成员是   找到了。在下面查看类型和成员。添加自定义映射   表达式,忽略,添加自定义解析器或修改   源/目标类型对于没有匹配的构造函数,请添加一个无参数   ctor,添加可选参数或映射所有构造函数参数

     

================================================ =============

     

AutoMapper为您创建了此类型映射,但是您的类型不能为   使用当前配置映射。 REL_GROUP_ROLE->   MEMBER_GROUP_Model(目标成员列表)   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.MEMBER_GROUP_Model   (目标成员列表)

     

未映射的属性:ID MEMBER_ID AUTH_GROUP MEMBER

     在

  AutoMapper.ConfigurationValidator.AssertConfigurationIsValid(IEnumerable`1   在lambda_method(Closure,LKP_ROLE,ROLE_Model,   ResolutionContext)---内部异常堆栈跟踪的结尾---
  在lambda_method(Closure,LKP_ROLE,ROLE_Model,ResolutionContext)   引发异常:“ AutoMapper.AutoMapperMappingException”在   AutoMapper.dll frknc:AutoMapper.AutoMapperMappingException:错误   映射类型。

     

映射类型:REL_GROUP_ROLE-> GROUP_ROLE_Model   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.GROUP_ROLE_Model

     

类型映射配置:REL_GROUP_ROLE-> GROUP_ROLE_Model   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.GROUP_ROLE_Model

     

目标成员:ROLE ---> AutoMapper.AutoMapperMappingException:   错误映射类型。

     

映射类型:LKP_ROLE-> ROLE_Model TL.CFM.DATA.LKP_ROLE->   TL.CFM.CORE.ROLE_Model

     

类型映射配置:LKP_ROLE-> ROLE_Model TL.CFM.DATA.LKP_ROLE->   TL.CFM.CORE.ROLE_Model

     

目标成员:GROUP_ROLEs --->   AutoMapper.AutoMapperConfigurationException:未映射的成员是   找到了。在下面查看类型和成员。添加自定义映射   表达式,忽略,添加自定义解析器或修改   源/目标类型对于没有匹配的构造函数,请添加一个无参数   ctor,添加可选参数或映射所有构造函数参数

     

================================================ =============

     

AutoMapper为您创建了此类型映射,但是您的类型不能为   使用当前配置映射。 REL_GROUP_ROLE->   MEMBER_GROUP_Model(目标成员列表)   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.MEMBER_GROUP_Model   (目标成员列表)

     

未映射的属性:ID MEMBER_ID AUTH_GROUP MEMBER

     在

  AutoMapper.ConfigurationValidator.AssertConfigurationIsValid(IEnumerable`1   在lambda_method(Closure,LKP_ROLE,ROLE_Model,   ResolutionContext)---内部异常堆栈跟踪的结尾---
  在lambda_method(Closure,LKP_ROLE,ROLE_Model,ResolutionContext)   在   AutoMapper.Mapper.AutoMapper.IRuntimeMapper.Map [TSource,TDestination](TSource   源,TDestination目标,ResolutionContext上下文,   ImemberMap memberMap)位于lambda_method(Closure,LKP_AUTH_GROUP,   AUTH_GROUP_Model,ResolutionContext)-内部异常结束   堆栈跟踪--在lambda_method(Closure,LKP_AUTH_GROUP,   AUTH_GROUP_Model,ResolutionContext)引发的异常:   AutoMapper.dll frknc中的'AutoMapper.AutoMapperMappingException':   AutoMapper.AutoMapperMappingException:错误映射类型。

     

映射类型:LKP_AUTH_GROUP-> AUTH_GROUP_Model   TL.CFM.DATA.LKP_AUTH_GROUP-> TL.CFM.CORE.AUTH_GROUP_Model

     

类型映射配置:LKP_AUTH_GROUP-> AUTH_GROUP_Model   TL.CFM.DATA.LKP_AUTH_GROUP-> TL.CFM.CORE.AUTH_GROUP_Model

     

目标成员:GROUP_ROLEs --->   AutoMapper.AutoMapperMappingException:错误映射类型。

     

映射类型:REL_GROUP_ROLE-> GROUP_ROLE_Model   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.GROUP_ROLE_Model

     

类型映射配置:REL_GROUP_ROLE-> GROUP_ROLE_Model   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.GROUP_ROLE_Model

     

目标成员:ROLE ---> AutoMapper.AutoMapperMappingException:   错误映射类型。

     

映射类型:LKP_ROLE-> ROLE_Model TL.CFM.DATA.LKP_ROLE->   TL.CFM.CORE.ROLE_Model

     

类型映射配置:LKP_ROLE-> ROLE_Model TL.CFM.DATA.LKP_ROLE->   TL.CFM.CORE.ROLE_Model

     

目标成员:GROUP_ROLEs --->   AutoMapper.AutoMapperConfigurationException:未映射的成员是   找到了。在下面查看类型和成员。添加自定义映射   表达式,忽略,添加自定义解析器或修改   源/目标类型对于没有匹配的构造函数,请添加一个无参数   ctor,添加可选参数或映射所有构造函数参数

     

================================================ =============

     

AutoMapper为您创建了此类型映射,但是您的类型不能为   使用当前配置映射。 REL_GROUP_ROLE->   MEMBER_GROUP_Model(目标成员列表)   TL.CFM.DATA.REL_GROUP_ROLE-> TL.CFM.CORE.MEMBER_GROUP_Model   (目标成员列表)

     

未映射的属性:ID MEMBER_ID AUTH_GROUP MEMBER

     在

  AutoMapper.ConfigurationValidator.AssertConfigurationIsValid(IEnumerable`1   在lambda_method(Closure,LKP_ROLE,ROLE_Model,   ResolutionContext)---内部异常堆栈跟踪的结尾---
  在lambda_method(Closure,LKP_ROLE,ROLE_Model,ResolutionContext)   在   AutoMapper.Mapper.AutoMapper.IRuntimeMapper.Map [TSource,TDestination](TSource   源,TDestination目标,ResolutionContext上下文,   ImemberMap memberMap)位于lambda_method(Closure,LKP_AUTH_GROUP,   AUTH_GROUP_Model,ResolutionContext)-内部异常结束   堆栈跟踪--在lambda_method(Closure,LKP_AUTH_GROUP,   AUTH_GROUP_Model,ResolutionContext)-内部异常结束   堆栈跟踪--在lambda_method(Closure,LKP_AUTH_GROUP,   AUTH_GROUP_Model,ResolutionContext)引发的异常:   AutoMapper.dll中的“ AutoMapper.AutoMapperMappingException”

2 个答案:

答案 0 :(得分:0)

您是否尝试在配置文件中忽略它们并查看错误是否仍然存在?如果问题仍然存在,您是否尝试研究异常详细信息?应该说没有映射哪些成员? ForAllOtherMemebers(x => x.Ignore())。更多信息:dotnettutorials.net/lesson/ignore-using-automapper-in-csharp

最重要的是,您不能将ICollection映射到ICollection,因为它们不是具体类型。例如:

源可以是IEnumerable,但输出只能是列表。

答案 1 :(得分:0)

映射时,自动映射器将为未使用的dto对象键抛出错误。

以下内容解决了该问题。将此添加到您的个人资料。

.ForAllOtherMembers(x => x.Ignore())