AutoMapper 5.1 - 地图模型和扩展模型
AutoMapper 5.1 - Map Model and extended Model
我是 AutoMapper 的新手,我使用的是 5.1.1 版本。
我试图将模型列表映射到扩展模型列表。我在 return.
中得到空对象
我的源模型
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。
有人可以帮助我吗?
不要映射列表,而是像这样映射:
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);
spt_detail 到 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);
如果您想映射其他模型,只需添加或编辑您的配置即可。
您在这里错过了两个步骤。
第一个是您需要初始化一个业务对象列表,而不是只初始化一个。
您从数据库中检索列表(您使用 .Tolist())
这是一个关于我如何初始化对象的示例:
List <SptDetail> details = new List <SptDetail> {
new SptDetail {
Age = "10",
Name = "Marion"
},
new SptDetail {
Age = "11",
Name = "Elisabeth"
}
};
第二个失误是您在映射 lits,我建议使用您的单一业务 class 对象,而不是像下面这样:
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();
}
}
希望对您有所帮助!
我是 AutoMapper 的新手,我使用的是 5.1.1 版本。 我试图将模型列表映射到扩展模型列表。我在 return.
中得到空对象我的源模型
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。
有人可以帮助我吗?
不要映射列表,而是像这样映射:
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);
spt_detail 到 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);
如果您想映射其他模型,只需添加或编辑您的配置即可。
您在这里错过了两个步骤。
第一个是您需要初始化一个业务对象列表,而不是只初始化一个。 您从数据库中检索列表(您使用 .Tolist())
这是一个关于我如何初始化对象的示例:
List <SptDetail> details = new List <SptDetail> {
new SptDetail {
Age = "10",
Name = "Marion"
},
new SptDetail {
Age = "11",
Name = "Elisabeth"
}
};
第二个失误是您在映射 lits,我建议使用您的单一业务 class 对象,而不是像下面这样:
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();
}
}
希望对您有所帮助!