문제

아래에 설명 된대로 코드를 사용하여 automapper를 사용하고 있습니다.http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

나는 그것이 매우 플라크가 많고 예측할 수없는 것을 본다.

1) 때때로 동일한 DataReader의 동일한 코드는 DTO 결과 세트로 값을 다시 가져 오며 때로는 그렇지 않습니다. 2) 데이터베이스에서 100, 200으로 ID 값이 있습니다. 유형 정수 인 DTO에 매핑 될 때이 100은 큰 값 (234343211)으로 변경됩니다.

내가이 불만을 보는 이유에 대한 아이디어. (reader.read ()) while 표준을 사용해야합니까? 그리고 Automapper 사용을 중지하십니까?

도움이 되었습니까?

해결책

나는이 같은 문제에 부딪쳤다. 소스 유형과 대상 유형이 정확히 같지 않은 경우에 발생하는 것 같습니다.

제 경우에는 int 유형 인 ID 필드가있는 SQL 서버 테이블이있었습니다. 값은 유형이 길고 속성이있는 클래스에 매핑되었습니다 (int64). 이로 인해 100의 예상 값은 668386727769314912와 같은 것으로 맵핑 될 것입니다. ID가 큰 테이블 스키마를 변경 한 후에는 값이 항상 올바르게 매핑되었습니다.

소스 유형과 대상 유형을 면밀히 살펴보면 정확히 동일하도록 권장합니다. 분명히, 당신이 암시 적으로 작동 할 것으로 예상되는 전환 (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());
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top