2010-03-11 105 views
6

我使用AutoMapper使用下面的代碼 http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/AutoMapper映射的IEnumerable到DataReader的問題

我認爲這是非常flakky ......和不可預測所討論的DataReader的。

1)具有相同數據讀取器的相同代碼有時會將值返回給dto結果集,有時不會。 2)我有一個來自數據庫的ID值爲100,200。當它映射到整數類型的DTO時,這個100被更改爲一個較大的值(如234343211)。

任何想法,爲什麼我看到這種矛盾。我應該使用標準 while(reader.Read())?並停止使用automapper?

+1

嗯......很奇怪......這將是可能的,你給我送一些樣本數據和證明問題的樣本源對象?這應該有助於我縮小範圍。謝謝! – 2010-03-12 02:04:38

回答

18

我遇到了同樣的問題。這似乎發生在您的源類型和目標類型不完全相同時。

在我的情況下,我有一個ID爲INT類型的SQL Server表。該值被映射到類型爲long的屬性的類(Int64)。這會導致期望值100被映射到類似668386727769314912之類的內容。在更改表模式以使ID爲BIGINT之後,這些值始終正確映射。

我建議仔細查看源類型和目標類型,以確保它們完全相同。很顯然,您期望隱式工作的轉換(如Int32到Int64)可能會導致問題。

這裏是將重現該問題的例子:

public class DataMapperIssue 
{ 
    public class Person 
    { 
     public long id { get; set; } 
     public string first_name { get; set; } 
     public string last_name { get; set; } 
    } 

    public static void run() 
    { 
     var table = new DataTable(); 

     table.Columns.Add("id", typeof(int)); 
     table.Columns.Add("first_name", typeof(string)); 
     table.Columns.Add("last_name", typeof(string)); 

     table.Rows.Add(100, "Jeff", "Barnes"); 
     table.Rows.Add(101, "George", "Costanza"); 
     table.Rows.Add(102, "Stewie", "Griffin"); 
     table.Rows.Add(103, "Stan", "Marsh"); 
     table.Rows.Add(104, "Eric", "Cartman"); 

     AutoMapper.Mapper.Reset(); 
     AutoMapper.Mapper.CreateMap<IDataReader, Person>(); 

     var results = AutoMapper.Mapper.Map<IDataReader, IList<Person>>(table.CreateDataReader()); 
    } 
} 
+0

這就像一個魅力!謝謝。 – 2012-03-02 13:31:10