Ajouter des procédures stockées avec entity framework 4

Que ça soit pour des raisons de sécurité ou de légèreté des données à importer, l’utilisation de procédures stockées peut être une bonne solution.

Une fois votre procédure stockée créée, il faut ajouter un fichier .edmx au projet afin de faire la liaison entre l’application et la base de données.

Une fois la procédure stockée créée dans la base, il faut l’ajouter au model existant dans le projet.

Dans le projet ouvrir le MonModel.edmx, dans le diagramme ouvrir l’explorateur de modèles.

D’un clic droit sur le diagramme, sélectionner « Mettre à jour le modèle depuis la base de données et sélectionner la procédure à importer ».

sp_entity4_1

Dans l’explorateur de Modèles, il y a donc 3 dossiers : Diagrams, MonModel et MonModel.Store

Dans le dossier MonModel, il faut ajouter le type complexe de retour (si retour il y a, ici un type complexe).

sp_entity4_1b

Dans le dossier MonModel.Store, se trouvent les dossiers de tables/vues et des procédures stockées.

Sélectionner la procédure stockée et d’un clic droit sélectionner “Ajouter une importation de fonction”.

sp_entity4_2

Une fois la procédure stockée sélectionnée, le type de d’objet complexe lié etc… vous pouvez mettre à jour et cliquer sur OK.

Regénérer la solution et si tout c’est bien passé, dans l’explorateur de solution doit se trouver l’appel à la procédure stockée (MonModel.Context.tt > MonModel.Context.cs > sp_getTest).

Problemes courants :

Les types complexes sont inaccessibles :

– Ouvrir le fichier edmx avec l’éditeur xml et vérifier les types complexes associés.

<ComplexType Name="sp_getTestComplexe_Result">
         <Property Type="Int32" Name="ID" Nullable="false" />
         <Property Type="String" Name="Label" Nullable="true" MaxLength="150" />
         <Property Type="DateTime" Name="DateCreation" Nullable="true" />
         <Property Type="Int32" Name="OperateurID" Nullable="false" />
         <Property Type="Int32" Name="EtatID" Nullable="false" />
         <Property Type="String" Name="SubLabel" Nullable="false" MaxLength="200" />
</ComplexType>

– MonModel.Context.cs :

public virtual ObjectResult<sp_getTestComplexe_Result> sp_getTest(Nullable<int> Id){
           var IdParameter = Id.HasValue ?
               new ObjectParameter("ID", id) :
               new ObjectParameter("ID", typeof(int));
           return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<sp_getTestComplexe_Result>("sp_getTest", IdParameter);
       }

– Ajouter la classe objet type de retour dans MonModel.tt :

public partial class sp_getTestComplexe_Result {
       public int ID { get; set; }
       public string Label { get; set; }
       public Nullable<System.DateTime> DateCreation { get; set; }
       public int OperateurID { get; set; }
       public int EtatID{ get; set; }
       public string SubLabel{ get; set; }
}

Laisser un commentaire