2010-03-11 99 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