【问题标题】:Automapper complex types mapping exceptionAutomapper 复杂类型映射异常
【发布时间】:2016-08-04 18:53:21
【问题描述】:

我正在尝试为新模块实现 AutoMapper。

我在网站上有 MVC 模型,我正在研究,它看起来像这样:

public class MvcModel
{
    public Params Params { get; set; }
    public Steps Steps { get; set; }
}    
public class Params
{
    public int? RequestId { get; set; } 
    public bool NewClient { get; set; }
}    
public class Steps
{
    public Step1 Step1 { get; set; }    
    public Step2 Step2 { get; set; }    
    public Step3 Step3 { get; set; }    
}    
public class Step1
{
    public int Name { get; set; }   
}    
public class Step2
{
    public int Phone { get; set; }  
}    
public class Step3
{
    public int Email { get; set; }  
}

另一方面,我有下一节课,我必须传递给一些服务:

public class Request
{
    public Parameters Parameters { get; set; }
    public RequestContent RequestContent { get; set; }
}

public class Parameters
{
    public int NewClient { get; set; }
}

public class RequestContent
{
    public int Id { get; set; } 
    public int InnerId { get; set; }
    public string Session { get; set; }
    public string Clerk { get; set; }
    public bool Private { get; set; }

    public PersonalDetails PersonalDetails { get; set; }    
    public Phones Phones { get; set; }  
    public ElectonicCommunication ElectonicCommunication { get; set; }  
}

public class PersonalDetails
{
    public int Name { get; set; }   
}

public class Phones
{
    public int Phone { get; set; }  
}

public class ElectonicCommunication
{
    public int Email { get; set; }  
}

我创建了一个新的 AutoMapper 配置类(从 Global.asax 中调用):

public class AutoMapperConfig
{
    public static void Configure()
    {
        MapperConfiguration MapperConfiguration = new MapperConfiguration(cfg => {
            cfg.AddProfile<Out>();
            cfg.AddProfile<In>();
            cfg.CreateMap<MvcModel, Request>();
        });
        MapperConfiguration.AssertConfigurationIsValid();
    }
}

public class Out: Profile
{
    protected override void Configure()
    {
        CreateMap<MvcModel, Request>()
            .ForMember(dest => dest.Parameters, opt => opt.MapFrom(src => src.Params))
            .ForMember(dest => dest.RequestContent, opt => opt.MapFrom(src => src.Steps));
    }
}

public class In: Profile
{
    protected override void Configure()
    {
        CreateMap<Request, MvcModel>()
            .ForMember(dest => dest.Params, opt => opt.MapFrom(src => src.Parameters))
            .ForMember(dest => dest.Steps, opt => opt.MapFrom(src => src.RequestContent));
    }
}

它们在示意图上很相似,尽管真实的物体要大一些并且名称不同。

预期: MvcModel 被映射到 Request 并向后映射。

更准确地说:

  1. MvcModel.Params 映射到 Request.Parameters 并向后映射
  2. MvcModel.Steps 映射到 Request.RequestContent 并向后映射
  3. InnerId, Session, Clerk, Private from Request.RequestContent 必须被忽略

问题:在应用程序启动时出现错误:

无法映射 ... 上的以下属性:
添加自定义映射表达式、忽略、添加自定义解析器或修改 目的地类型... 语境: 映射到属性 ... 从 ... 到 ... 从类型 ... 到 ... 的映射 从源类型 AutoMapperMessageBugTests.SourceChild 映射到类型 引发了“AutoMapper.AutoMapperConfigurationException”类型的异常。

我没有找到关于如何在应用程序中全局使用 AutoMapper 的良好文档,只是不知道如何正确使用它以及我到底做错了什么。

我找不到一个很好的复杂对象映射以太的例子......

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您还需要告诉 AutoMapper 如何映射每个属性的类,因为它们不同 - 所以定义其他类之间的映射,即 Params &lt;=&gt; ParametersRequestContent &lt;=&gt; Steps
  • @stuartd 你的意思是,我必须映射每个单独的类,MvcModelRequest 在内部分层,然后才映射它们的父级,然后映射它们的父级......?
  • AutoMapper 需要知道如何映射每个类,是的。
  • @stuartd 谢谢。还有一件事:我真的需要创建 2 个配置文件才能拥有“双向映射”吗?
  • 您不需要有两个配置文件,但是是的,您需要以两种方式定义映射:ReverseMap() 只处理简单的情况 - 你的肯定不是......

标签: c# .net automapper


【解决方案1】:

感谢 stuartd 现在可以正常工作了!

我不明白的是,我必须从下到上映射!所有的子对象都必须先映射,所以在映射父对象的那一刻它们就会被识别!

现在的个人资料看起来像这样:

public class Out: Profile
{
   protected override void Configure()
    {
        CreateMap<Step1, PersonalDetails>();
        CreateMap<Step2, Phones>();
        CreateMap<Step3, ElectonicCommunication>();

        CreateMap<Params, Parameters>();
        CreateMap<Params, RequestContent>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.RequestId))
            .ForAllMembers(opt => opt.Ignore());
        CreateMap<Steps, RequestContent>()
            .ForMember(dest => dest.PersonalDetails, opt => opt.MapFrom(src => src.Step1))
            .ForMember(dest => dest.Phones, opt => opt.MapFrom(src => src.Step2))
            .ForMember(dest => dest.ElectonicCommunication, opt => opt.MapFrom(src => src.Step3))
            .ForAllMembers(opt => opt.Ignore());

        CreateMap<MvcModel, Request>()
            .ForMember(dest => dest.Parameters, opt => opt.MapFrom(src => src.Params))
            .ForMember(dest => dest.RequestContent, opt => opt.MapFrom(src => src.Steps));
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多