【问题标题】:How to use AutoMapper without Entity Framework?如何在没有实体框架的情况下使用 AutoMapper?
【发布时间】:2020-06-09 20:11:10
【问题描述】:

我正在学习如何使用 AutoMapper。首先,我不使用实体框架来读取我的数据。

因此,就我而言,我必须为响应模型的每个属性进行手动映射。

以下代码可能会帮助您更深入地了解这一点:

响应模型:

 public class TotalLossResults
 {
     public string N_CLAIM_NUMBER { get; set; }
     public string N_CLAIM_ID { get; set; }             
 }

映射类:

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

但这不起作用。它将最后一列的值绑定到所有模型属性。

在不使用手动映射方式的情况下实现映射的任何帮助/建议都会非常有帮助。

【问题讨论】:

标签: c# automapper


【解决方案1】:

我今天可以在 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 中创建配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2019-04-10
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多