【问题标题】:AutoMapper 5.1 - Map Model and extended ModelAutoMapper 5.1 - 地图模型和扩展模型
【发布时间】:2019-07-29 08:16:11
【问题描述】:

我是 AutoMapper 的新手,我使用的是 5.1.1 版本。 我试图用扩展模型列表映射模型列表。我得到空对象作为回报。

我的源模型

public class spt_detail
{
    public string Name { get; set; }
    public string Age { get; set; }
}

我的目标模型

public class spt_detail_extended : spt_detail
{   
    public string Mm1 { get; set; }
    public string Mm2 { get; set; }
}

AutoMapper 代码

spt_detail details = db.spt_detail.ToList();

Mapper.Initialize(n => n.CreateMap<List<spt_detail>, List<spt_detail_extended>>());
List<spt_creance_detail_enrichi> cenr = AutoMapper.Mapper.Map<List<spt_detail>, List<spt_detail_enrichi>>(details);

问题:详细信息包含 8 行但 cenr 0。

有人可以帮助我吗?

【问题讨论】:

    标签: c# asp.net-mvc automapper-5


    【解决方案1】:

    spt_detailspt_detail_extended 的映射。

    您应该只为模型创建地图规则,如下所示:

    Mapper.Initialize(cfg =>
    {
        cfg.CreateMap<spt_detail, spt_detail_extended>();
    });
    

    然后,你应该使用构造:

    List<spt_detail_extended> extendeds = Mapper.Map<List<spt_detail_extended>>(details);
    

    如果您想映射其他模型,只需添加或编辑您的配置。

    【讨论】:

      【解决方案2】:

      不要映射列表,而是像这样映射:

      Mapper.Initialize(n => n.CreateMap<spt_detail, spt_detail_extended>());
      

      你打电话来做地图会保持不变:

      List<spt_detail_extended> cenr = AutoMapper.Mapper.Map<List<spt_detail>, List<spt_detail_extended>>(details);
      

      【讨论】:

        【解决方案3】:

        你在这里错过了两个步骤。

        第一个是您需要初始化一个业务对象列表,而不是只初始化一个。 您从数据库中检索列表(您使用 .Tolist())

        这是我如何初始化对象的示例:

        List <SptDetail> details = new List <SptDetail> {
         new SptDetail {
          Age = "10",
           Name = "Marion"
         },
         new SptDetail {
          Age = "11",
           Name = "Elisabeth"
         }
        };
        

        第二个失误是您正在映射光照,我建议您使用单个业务类对象,而不是如下所示:

        Mapper.Initialize(n => n.CreateMap<SptDetail, SptDetailExtended>()
         .ForMember(obj => obj.ExProp1, obj => obj.MapFrom(src => src.Name))
         .ForMember(obj => obj.ExProp2, obj => obj.MapFrom(src => src.Age)));
        

        漏洞故事中的关键是使用 .ForMember 指定 wich 成员去哪里,因为属性名称不同。

        这是一个运行起来像魅力的代码示例:

        internal class Program
        {
            public static List<SptDetailExtended> InitializeExtendedObjects()
            {
                var details = new List<SptDetail>
                {
                    new SptDetail
                    {
                        Age = "10",
                        Name = "Marion"
                    },
                    new SptDetail
                    {
                        Age = "11",
                        Name = "Elisabeth"
                    }
                };
                //this is wrong db.spt_detail.ToList();
        
                Mapper.Initialize(n => n.CreateMap<SptDetail, SptDetailExtended>() 
                  /*you need to use ForMember*/ .ForMember(obj => obj.ExProp1, obj => obj.MapFrom(src => src.Name))
                                                .ForMember(obj => obj.ExProp2, obj => obj.MapFrom(src => src.Age)));
        
                //instead of this Mapper.Initialize(n => n.CreateMap<List<spt_detail>, List<spt_detail_extended>>());
        
                //change your mapping like following too
                var cenr = Mapper.Map<List<SptDetailExtended>>(details);
                return cenr;
            }
            private static void Main(string[] args)
            {
                var result = InitializeExtendedObjects();
                foreach (var sptDetailExtended in result)
                {
                    Console.WriteLine(sptDetailExtended.ExProp1);
                    Console.WriteLine(sptDetailExtended.ExProp2);
                }
                Console.ReadLine();
            }
        }
        

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2021-06-25
          • 2013-05-10
          • 1970-01-01
          • 2016-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          • 2017-06-07
          相关资源
          最近更新 更多