Entity framework Code First - configurer le mappage pour SqlQuery

Je suis en utilisant Entity Framework 5 (avec une Première approche de Code) pour remplir une classe de mine de l'héritage de la procédure stockée avec des paramètres, et cela fonctionne bien (détails à suivre).
Mon problème est que je veux la carte les noms de colonnes à la propriété avec des noms différents (je n'aime pas les noms en provenance de l'Erp).
J'ai essayé d'utiliser une classe de Configuration (comme ce que je fais quand j'ai la carte de points de vue ou des tables) pour spécifier le nom de la colonne pour les propriétés avec un nom différent, et voici mes résultats:

  • si je n'utilise pas la classe de configuration (je n'ai pas l'ajouter dans la OnModelCreating méthode de la DbContext) puis EF fonctionne mais charge uniquement les propriétés qui correspondent exactement avec le nom des colonnes (et c'est ce que j'attendais dans ce cas); d'autres sont la propriété null;
  • si j'utilise la classe de configuration (ajouter à la modelBuilder dans le OnModelCreating méthode de la DbContext) puis EF soulève une exception indiquant que "Le lecteur de données est incompatible avec les '...'. Un membre du type, "Description", n'a pas de colonne correspondante dans le lecteur de données avec le même nom", et cela semble très étrange pour moi, parce que dans la configuration que j'ai préciser que la Description de la propriété la carte de la colonne ItemDescription.

Pourquoi la configuration est touchant mon résultat, mais ses spécifications ne sont pas utilisés pour mapper les colonnes? Est-il une autre façon de spécifier cette cartographie à l'aide de SqlQuery?

Voici les détails:

Ma classe POCO:

public class Item
    {
        public String Id { get; set; }
        public String Description { get; set; }
    }

La classe de configuration:

public class ItemConfiguration : EntityTypeConfiguration<Item>
    {
        public ItemConfiguration()
        {
            HasKey(x => new { x.Id });
            Property(x => x.Id).HasColumnName("Code");
            Property(x => x.Description).HasColumnName("ItemDescription");
        }
    }

Le retour d'une procédure stockée les données avec les colonnes "Code" et "ItemDescription"; je l'appelle de cette façon:

var par = new SqlParameter();
par.ParameterName = "@my_par";
par.Direction = ParameterDirection.Input;
par.SqlDbType = SqlDbType.VarChar;
par.Size = 20;
par.Value = ...;

var data = _context.Database.SqlQuery<Item>("exec spItem @my_par", par);

et avec cela j'ai ajouter la configuration du contexte:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
      modelBuilder.Configurations.Add(new ItemConfiguration());
}

Merci!

Je suis si heureux de ce post. J'ai eu du mal avec le mien et tout ce que je devais était la exec partie. J'ai trouvé des tonnes d'exemples, et aucun n'avait la exec partie.

OriginalL'auteur Daniele Armanasco | 2013-02-06