【问题标题】:"Error mapping types" error on AutoMapper for ICollection typed membersICollection 类型成员的 AutoMapper 上的“错误映射类型”错误
【发布时间】:2019-09-30 08:27:08
【问题描述】:

我在尝试将 DTO 转换为 Model 时收到以下错误消息。

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_GROUPs

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' in 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' in 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 typeMaps) 在 lambda_method(Closure , LKP_ROLE , ROLE_Model , ResolutionContext ) --- 内部异常堆栈跟踪结束 ---
在 lambda_method(闭包,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 typeMaps) 在 lambda_method(Closure , LKP_ROLE , ROLE_Model , ResolutionContext ) --- 内部异常堆栈跟踪结束 ---
在 lambda_method(闭包,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 typeMaps) 在 lambda_method(Closure , LKP_ROLE , ROLE_Model , ResolutionContext ) --- 内部异常堆栈跟踪结束 ---
在 lambda_method(闭包,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”

【问题讨论】:

  • 那么实际的错误是什么? :) 堆栈溢出?
  • @LucianBargaoanu 为什么/如何“ForMember(d => d.GROUP_ROLEs, f => f.MapFrom(src => src.REL_GROUP_ROLE))”部分会导致问题?
  • 如果你不知道确切的错误,我们在这里浪费时间:)
  • @LucianBargaoanu 我是 AutoMapper 的新手,如果您根据自己的经验看不出任何奇怪的东西,我无话可说。
  • 好的,所以这个错误告诉你确切地出了什么问题。如果将 CreateMissingTypeMaps 设置为 false,您可能会更好地理解。

标签: c# entity-framework-6 automapper


【解决方案1】:

Automapper 将在映射时为未使用的 dto 对象键抛出错误。

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

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

【讨论】:

  • 这将忽略任何未明确映射的成员。 anti AutoMapper。不好:)
【解决方案2】:

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

除此之外,您不能将 ICollection 映射到 ICollection,因为它们不是具体类型。例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多