6 Stimmen

AutoMapper Mapping IEnumerable zu DataReader Problem

Ich bin mit AutoMapper zu datareader mit Code wie unten beschrieben http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

Ich sehe sie als sehr unbeständig und unberechenbar an.

1) Derselbe Code mit demselben Datareader bringt manchmal einen Wert zurück in die dto-Ergebnismenge und manchmal nicht. 2) Ich habe einen ID-Wert aus der Datenbank als 100, 200. Wenn es auf die DTO, die vom Typ Integer ist diese 100 wird zu einem großen Wert (wie 234343211) geändert zugeordnet.

Haben Sie eine Idee, warum ich diese Unstimmigkeit erlebe? Sollte ich den Standard verwenden while (reader.Read()) verwenden? und den Automapper nicht mehr benutzen?

18voto

Jeff Barnes Punkte 196

Ich bin auf dasselbe Problem gestoßen. Es scheint aufzutreten, wenn der Quelltyp und der Zieltyp nicht genau übereinstimmen.

In meinem Fall hatte ich eine SQL Server-Tabelle mit einem ID-Feld, das vom Typ INT war. Der Wert wurde einer Klasse mit einer Eigenschaft vom Typ long (Int64) zugeordnet. Dies würde dazu führen, dass der erwartete Wert von 100 etwa 668386727769314912 zugeordnet wird. Nachdem das Tabellenschema so geändert wurde, dass ID ein BIGINT ist, wurden die Werte immer korrekt zugeordnet.

Ich würde empfehlen, sich den Quelltyp und den Zieltyp genau anzusehen, um sicherzustellen, dass sie genau übereinstimmen. Offenbar können Konvertierungen, von denen man erwarten würde, dass sie implizit funktionieren (wie Int32 nach Int64), Probleme verursachen.

Hier ist ein Beispiel, das das Problem reproduziert:

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());
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X