簡體   English   中英

如何在沒有實體框架的情況下使用 AutoMapper?

[英]How to use AutoMapper without Entity Framework?

我正在學習如何使用 AutoMapper。 首先,我不使用實體框架來讀取我的數據。

因此,就我而言,我必須為響應 model 的每個屬性進行手動映射。

下面的代碼可以幫助您更深入地了解這一點:

響應 model:

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

注意:在映射器 class 中,我使用了每個屬性來擺脫每個屬性的mappingExpression.ForMember語句。 但這僅在屬性名稱與我從數據庫獲得的結果的列名稱(例如實體名稱)相同時才有效。

我正在尋找一些選項,當屬性名稱與列名稱不匹配時,我可以對 map 數據值對我的響應 model 屬性采取類似的方法。

我試着做這樣的事情:

我創建了另一個 class ,它具有不同名稱的屬性:

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

但這不起作用。 它將最后一列的值綁定到所有 model 屬性。

在不使用手動映射方式的情況下實現映射的任何幫助/建議都會非常有幫助。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM