Отображение AutoMapper IEnumerable к проблеме DataReader - PullRequest
6 голосов
/ 12 марта 2010

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

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

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

Любые идеи о том, почему я вижу это несоответствие. Должен ли я использовать стандарт пока (reader.Read ())? и прекратить использовать autopper?

1 Ответ

18 голосов
/ 21 апреля 2010

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

В моем случае у меня была таблица 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...