我正在学习如何使用AutoMapper。首先,我不使用实体框架读取数据。
因此,就我而言,我必须对响应模型的每个属性进行手动映射。
下面的代码可以帮助您获得更多了解:
响应模型:
public class TotalLossResults
{
public string N_CLAIM_NUMBER { get; set; }
public string N_CLAIM_ID { get; set; }
}
MapperClass:
public class TLResultsMapper : Profile
{
private TotalLossResults tlResultsObj = new TotalLossResults();
public TLResultsMapper()
{
IMappingExpression<DataRow, TotalLossResults> mappingExpression = CreateMap<DataRow, TotalLossResults>();
foreach (var prop in tlResultsObj.GetType().GetProperties())
{
mappingExpression.ForMember(prop.Name, y => y.MapFrom(s => s[prop.Name]));
}
}
}
注意:在我使用的每个映射器类中,每个属性都摆脱了mappingExpression.ForMember
语句。但这仅在属性名称与我从数据库获得的结果的列名称(例如实体名称)相同时起作用。
我正在寻找一些选择,当属性名称与列名称不匹配时,我可以采用类似的方法将数据值映射到响应模型属性。
我试图做这样的事情:
我创建了另一个具有不同名称属性的类:
public class TLResultsDifferentNames
{
public string N_CLAIM_NUMBER { get; set; }
public string N_CLAIM_ID { get; set; }
}
和这样的映射器实现:
private TLResultsDifferentNames tlResultsObj = new TLResultsDifferentNames ();
private TotalLossResults tlResultsColObj = new TotalLossResults ();*
for (int i = 0, j = 0; i<tlResultsObj.GetType().GetProperties().Length - 1 && j<tlResultsColObj.GetType().GetProperties().Length - 1; i++, j++)
{
mappingExpression.ForMember(tlResultsObj.GetType().GetProperties()[i].Name, y => y.MapFrom(s => s[tlResultsColObj.GetType().GetProperties()[j].Name]));
}
但这不起作用。它将最后一列的值绑定到所有模型属性。
在不使用手动映射方式的情况下实现映射的任何帮助/建议将非常有帮助。
答案 0 :(得分:0)
我今天在Auto Mapper中发现了一些非常有趣的东西。属性映射和使用哪种属性,我不必担心模型的任何手动/动态映射。
下面的代码现在对所有属性都可以正常使用:
Ex1:这里所有属性的名称都相同
[AutoMap(typeof(object))] //this takes our Source class name
public class TotalLossResults
{
public string N_CLAIM_NUMBER { get; set; }
public string N_CLAIM_ID { get; set; }
}
Ex2:在这里我们得到了不同的属性
[AutoMap(typeof(TotalLossResults))] //this takes our Source class name
public class TLResultsDifferentNames
{
[SourceMember(nameof(TotalLossResults.N_CLAIM_NUMBER))]
public string claimNumberOfJack { get; set; }
public string claimIDofJack { get; set; }
}
对于映射配置,我们将使用以下代码:
var config1 = new MapperConfiguration(cfg =>
cfg.AddMaps(typeof(TotalLossResults)));
var mapper = new Mapper(config1);
var response = mapper.Map<TotalLossResults>(sourceObject);
注意:最好在App Start中创建配置。