Je suis en train de faire la transition d'un projet de Webforms vers une application MVC en utilisant la première approche de la base de données Entity Framework. La base de données est prête ainsi que toutes les procédures stockées en place.
J'ai réussi à créer un fichier .edmx
et j'étais capable d'utiliser mes procédures stockées et cela fonctionnait très bien lorsqu'il y avait une opération d'insertion ou de mise à jour à effectuer. Mais le vrai problème est survenu lorsque j'utilisais une requête de sélection dans l'une de mes procédures stockées.
Par exemple, il existe une table Employee
qui contient les colonnes suivantes:
EmpId, FirstName, LastName, Age, Salary
J'ai une procédure stockée GetAllEmpDetails
qui a la requête suivante de sélection.
Select
EmpId, (FirstName + ' ' + LastName) as FullName, Salary
from
Employee
Maintenant, lorsque j'essaie de lier le résultat de cette procédure stockée à la classe Employee
, qui possède 5 propriétés, conformément à la structure de la table, j'obtiens une erreur indiquant que la propriété Age
est attendue, mais qu'elle n'est pas disponible dans le jeu de résultats.
Je sais qu’il n’existe pas non plus de propriété FullName
; ma question est donc de savoir comment résoudre ce problème avec la classe de modèle générée (comme dans ce cas Employee
) afin qu’elle puisse gérer ce dynamisme.
Comment mapper une procédure stockée dans EF?
Puisque vous utilisez Première approche de la base de données et que vous avez un fichier EDMX, laissez EF générer la classe du résultat de la procédure stockée pour vous. Vous pouvez avoir plusieurs procédures stockées et vous voulez éviter de créer les classes manuellement: Après tout, l’intérêt d’utiliser un outil ORM est tout. De plus, certaines de vos procédures stockées peuvent avoir des paramètres. Le faire de la manière ci-dessous gérera tout cela pour vous. C'est en fait assez simple.
Pour que EF le fasse à votre place, suivez les étapes ci-dessous:
Vous verrez le dialogue semblable à ci-dessous:
Cela ajoutera la procédure stockée et vous la verrez dans votre navigateur de modèle, comme indiqué ci-dessous:
Quelques notes
C'est bien mieux que d'écrire les classes manuellement dans le cas où le nom de votre procédure stockée, les paramètres dont il a besoin ou le résultat renvoyé changent. Cette approche fonctionnera également pour les fonctions définies par l'utilisateur.
A Gotcha
Il y aura des moments où la procédure stockée n'apparaîtra pas dans la sélection dans la boîte de dialogue de l'assistant, à cause de this . Ajoutez simplement ceci au début de votre procédure stockée:
SET FMTONLY OFF -- REMEMBER to remove it once the wizard is done.
public class EmployeeProcedure
{
[Column("EmpId")]
public int EmployeeId { get; set; }
[NotMapped]
public string FullName { get; set; }
public double Salary { get; set; }
}
après cet appel ceci:
this.Database.SqlQuery<EmployeeProcedure>("GetAllEmpDetails");