AutoMapper, отображающий IEnumerable на проблему DataReader

Я использую AutoMapper для datareader использующий кода, как обсуждено ниже http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

Я вижу, что он очень flakky... и непредсказуем.

1) Тот же код с тем же datareader время от времени возвращает значение dto набору результатов и время от времени doesnot. 2) у меня есть Значение идентификатора, прибывающее из базы данных как 100, 200. Когда это отображается на DTO, который имеет целое число типа, это 100 изменяется на большое значение (как 234343211).

Какие-либо идеи о том, почему я вижу это несоответствие. Если я использую стандарт в то время как (читатель. Читайте ())? и прекратите использовать автокартопостроитель?

6
задан Jader Dias 21 April 2010 в 15:32
поделиться

1 ответ

Я столкнулся с той же проблемой. Кажется, это происходит, когда ваш исходный тип и тип назначения не совсем совпадают.

В моем случае у меня была таблица 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());
    }
}
18
ответ дан 8 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: