Question

J'utilise AutoMapper à datareader en utilisant le code comme indiqué ci- http://elegantcode.com/2009/10/16/ cartographie de-idatareaderidatarecord-à-automapper /

Je vois être très flakky ... et imprévisible.

1) Même code avec la même datareader parfois apporte une valeur Retour au résultat dpour fixé et parfois doesnot. 2) J'ai une valeur d'identification provenant de la base de données 100, 200. Quand il mappe la DTO qui est de type entier ce 100 est changé en une grande valeur (comme 234343211).

Toutes les idées sur les raisons que je vois ce inconsitency. Dois-je utiliser la norme while (reader.Read ())? et cesser d'utiliser automapper?

Était-ce utile?

La solution

Je suis tombé sur ce même problème. Il semble se produire lorsque le type de source et le type de destination ne sont pas exactement les mêmes.

Dans mon cas, j'avais une table SQL Server avec un champ d'identification qui était de type INT. La valeur était mis en correspondance avec une classe avec une propriété qui était de type long (Int64). Cela aboutirait à la valeur attendue de 100 se mappé à quelque chose comme 668386727769314912. Après avoir changé le schéma de table afin que ID est un BIGINT, les valeurs toujours mis en correspondance correctement.

Je vous conseille de regarder attentivement le type de source et le type de destination afin d'assurer qu'ils sont exactement les mêmes. Apparemment, les conversions que vous attendez de travailler implicitement (comme Int32 à Int64) peuvent causer des problèmes.

Voici un exemple qui reproduit le problème:

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());
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top