6

以下で説明するように、コードを使用してデータリーダーに AutoMapper を使用しています http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

私はそれが非常に不安定であると見ています...そして予測不可能です。

1) 同じデータリーダーを使用した同じコードは、dto 結果セットに値を戻す場合と戻さない場合があります。2) データベースからの ID 値が 100、200 です。整数型の DTO にマップすると、この 100 は大きな値 (234343211 など) に変更されます。

なぜこの矛盾が見られるのかについてのアイデア。標準 while (reader.Read()) を使用する必要がありますか? オートマッパーの使用をやめますか?

4

1 に答える 1

18

私はこの同じ問題に遭遇しました。ソース タイプと宛先タイプがまったく同じでない場合に発生するようです。

私の場合、INT 型の ID フィールドを持つ SQL Server テーブルがありました。値は、long 型 (Int64) のプロパティを持つクラスにマップされていました。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());
    }
}
于 2010-04-21T15:25:55.907 に答える