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!
exec
partie. J'ai trouvé des tonnes d'exemples, et aucun n'avait la exec
partie.OriginalL'auteur Daniele Armanasco | 2013-02-06
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé ici:
http://entityframework.codeplex.com/workitem/233?PendingVoteId=233
que "La SqlQuery méthode est conçu pour ne pas prendre toute la cartographie en compte ...".
Ils disent aussi "Nous sommes d'accord qu'il serait utile d'avoir la possibilité de faire SqlQuery l'honneur les attributs de Colonne donc, nous allons suivre cette question de l'ouvrir et de le mettre sur notre carnet de commandes à envisager pour l'avenir.", donc, si vous avez le même problème, merci de voter 🙂
Faire que 2014...
Octobre 2014 et toujours rien. Voté question sur CodePlex.
En mars 2015. Il a maintenant le statut proposé. Jusqu'a voté sur codeplex.
Octobre 2015 encore de statut proposé. Jusqu'voté
OriginalL'auteur Daniele Armanasco
En attendant, vous pouvez utiliser cette méthode.
Quelques tests (parce que cela a fonctionné pour mes cours), mais pas difficile de le corriger si nécessaire...
Il a besoin d'un contexte (pour récupérer des mappé types personnalisés) et il a besoin d'une connexion différente pour exécuter un datareader sur elle en même temps.
Utilisation:
Liste des étudiants = Mappeur.Carte(contexte, (nouvelle SchoolContext()).La base de données.Connexion, "Select * from Étudiants");
OriginalL'auteur bubi