自动映射器 5.1 - 映射模型和扩展模型



我是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; }
}

自动映射器代码

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。

有人可以帮助我吗?

映射 for spt_detail to spt_detail_extended

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

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

之后,您将使用以下结构:

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

如果要映射其他模型,只需添加或编辑配置即可。

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

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);

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

第一个是您需要初始化业务对象的列表,而不是仅初始化单个对象。从数据库中检索列表(使用 .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指定成员的位置,因为属性没有相同的名称。

下面是一个像超级按钮一样运行的代码示例:

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();
    }
}

希望这有帮助!

相关内容

  • 没有找到相关文章

最新更新