Я использую AutoMapper для datareader использующий кода, как обсуждено ниже http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/
Я вижу, что он очень flakky... и непредсказуем.
1) Тот же код с тем же datareader время от времени возвращает значение dto набору результатов и время от времени doesnot. 2) у меня есть Значение идентификатора, прибывающее из базы данных как 100, 200. Когда это отображается на DTO, который имеет целое число типа, это 100 изменяется на большое значение (как 234343211).
Какие-либо идеи о том, почему я вижу это несоответствие. Если я использую стандарт в то время как (читатель. Читайте ())? и прекратите использовать автокартопостроитель?
Я столкнулся с той же проблемой. Кажется, это происходит, когда ваш исходный тип и тип назначения не совсем совпадают.
В моем случае у меня была таблица SQL Server с полем идентификатора типа INT. Значение было сопоставлено с классом со свойством типа long (Int64). Это приведет к тому, что ожидаемое значение 100 будет сопоставлено с чем-то вроде 668386727769314912. После изменения схемы таблицы так, чтобы идентификатор был 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());
}
}