我正在使用AutoMapper来使用下面讨论的代码将数据读取到DataReader
http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/
我看到它非常脆弱...而且变幻莫测。
1)使用相同数据读取器的相同代码有时会将值带回到dto结果集中,有时则不会。
2)我的ID值来自数据库,为100、200。当它映射到整数类型的DTO时,此100会更改为较大的值(例如234343211)。
关于为什么我会看到这种不一致的任何想法。我应该使用标准
而(reader.Read())?并停止使用自动映射器?
最佳答案
我遇到了同样的问题。当您的源类型和目标类型不完全相同时,似乎会发生这种情况。
就我而言,我有一个SQL Server表,其中的ID字段为INT类型。该值已映射到具有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());
}
}
关于.net - AutoMapper将IEnumerable映射到DataReader问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429194/