web-dev-qa-db-fra.com

Procédure stockée dans la première approche de la base de données Entity Framework

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.

4

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:

  1. Double-cliquez sur votre fichier EDMX 
  2. Choisissez Mettre à jour le modèle à partir de la base de données

Vous verrez le dialogue semblable à ci-dessous:

 enter image description here

  1. Assurez-vous d'avoir coché les cases comme indiqué.

Cela ajoutera la procédure stockée et vous la verrez dans votre navigateur de modèle, comme indiqué ci-dessous:

 enter image description here

  1. Si vous souhaitez modifier le nom de classe généré automatiquement par EF, faites-le. Je vous suggère fortement de faire cela et de donner à votre classe des noms significatifs qui respectent les conventions de nommage .NET. La convention que je suis est de supprimer tous les verbes du nom de la procédure stockée et d'ajouter le résultat Word à la fin. Donc, vous allez vous retrouver avec le nom comme indiqué ci-dessous:

 enter image description here

  1. Appuyer sur OK

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.
11
CodingYoshi
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");
0