Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu MEZIL

I love .Net

Abonnements

EF : SELECT avec une SP

Imaginons que l'on ait une procédure stockée qui fait juste un SELECT et que l'on veuille l'intégrer dans notre EDM. Pour cela, on va créer un entity type. Maintenant imposons une contrainte : il faut forcément passer par la procédure stockée pour récupérer des instances de notre entity type.

Ce scenario n'est pas vraiment prévu par la V1 de l'Entity Framework et de "bidouiller" un peu.

Imaginons la procédure stockée suivante :

CREATE PROCEDURE [dbo].[TOTO]

AS

BEGIN

      SELECT Id, 1 AS VALUE FROM Test

END

Quand on va récupérer notre procédure stockée dans notre EDM, on va avoir l'info dans le SSDL :

<Function Name="TOTO" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo" />

Ensuite, il faut créer l'entity type dans le CSDL (ce que l'on peut faire avec le designer) :

<EntityType Name="Toto">

    <Key>

        <PropertyRef Name="Id" />

    </Key>

    <Property Name="Id" Type="Int32" Nullable="false" />

    <Property Name="Value" Type="Int32" Nullable="true" />

</EntityType>

Avec la création de l'entity type, on va également avoir un EntitySet :

<EntitySet Name="Totos" EntityType="TestModel.Toto" />

Ensuite, on peut ajouter un "Function Import" dans le CSDL, ce qui aura pour effet de rajouter une méthode à notre ObjectContext qui appellera notre procédure stockée. Il suffit de lui préciser lors de l'ajout de "Function Import" que le type de retour est Toto.

Attention, il faut que les propriétés de Toto aient le même nom que les colonnes retournées par notre procédure stockée.

Ensuite, comme on ne veut pas de l'EntitySet sur notre ObjectContext (car on veut obligatoirement passé via la proc stock), on va le passer en private. A noter, qu'il est possible de le faire via le designer en allant sur la fenêtre Model Browser, puis en déroulant le noeud EntityContainer puis EntitySets puis en allant sur le noeud Totos, en allant ensuite dans la fenêtre Properties et en modifiant la visibilité du Getter.

On pourrait penser que c'est bon mais non ! En effet, il faut obligatoirement mapper l'entity type Toto (même si dans notre cas ça ne sert à rien).

Comment faire ?

Avec une SSDL View.

Vu qu'elle ne sera pas utilisée, on peut mettre n'importe quoi comme commande SQL :

<EntityContainer Name="TestModelStoreContainer">

    <EntitySet Name="Totos" EntityType="TestModel.Store.Toto" >

        <DefiningQuery>

            SELECT 1

        </DefiningQuery>

    </EntitySet>

</EntityContainer>

<EntityType Name="Toto">

    <Key>

        <PropertyRef Name="Id"/>

    </Key>

    <Property Name="Id" Type="int" Nullable="false"/>

    <Property Name="Value" Type="int" />

</EntityType>

et ensuite mapper l'entity type sur notre SSDL View.

Pour la V2, ce scenario sera réellement supporté comme me l'a confirmé Daniel Simmons : "In v2 we’re allowing sprocs to return complex types which will be the easy way to return objects which don’t need to be mapped, etc."

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mercredi 20 août 2008 13:19 par Matthieu MEZIL

Commentaires

# re: EF : SELECT avec une SP @ vendredi 22 août 2008 00:28

Sauf qu'un procédure stockée peut renvoyé plusieurs jeux de données, comment çà sera gérer (si çà l'est) ?

christian

# re: EF : SELECT avec une SP @ vendredi 22 août 2008 01:23

@ Christian: grrrrrrrrrrrrrr, donne moi un exemple stp et j'essayerai.

Matthieu MEZIL

# re: EF : SELECT avec une SP @ samedi 13 septembre 2008 15:15

Bien, et si je veux déclarer une association vers une autre entité par exemple Betise, mettons Toto.Betises pour obtenir les actions de Toto, est-il également possible de masquer la méthode Toto.Betises.Load() pour ne pas utiliser la requête générée par EF ? Dans ce cas comment obtenir une fonction sur le jeu d'association afin d'appeler une procédure stockée pour faire le SELECT ?

=&gt; en gros est-il possible de ne jamais utiliser les requêtes de sélection générées par EF et comment y parvenir ?

jpl

# re: EF : SELECT avec une SP @ samedi 13 septembre 2008 22:51

Dans ce cas, je pense qu'il faudrait rendre la navigation property private dans le modèle puis de rajouter une propriété publique Betises dans la classe Toto (partial) afin de gérer soit même le Load.

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Refactoring] ReSharper pour Visual Studio 2010 (Preview) par Thomas Jaskula le il y a 1 heure et 19 minutes

- [Refactoring] Analyser vos exceptions avec ReSharper Exceptional par Thomas Jaskula le il y a 2 heures et 33 minutes

- SharePoint 2007 : patterns & practices SharePoint Guidance par Philippe Sentenac [MVP SharePoint] le il y a 16 heures et 12 minutes

- [Visual Studio 2010] Les tests cases c’est bien, mais je vais devoir tout réécrire ? par Etienne Margraff le il y a 17 heures et 9 minutes

- MVP[Gribouillon].AddYear par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le il y a 17 heures et 24 minutes

- Clinique INSIA - Projet de fin d’Etudes (Silverlight 3 MVVM et OutOfBrowser, WCF, TFS) - Part 1 par David REI le 07-02-2009, 23:38

- C’est la crise ? Bah pourquoi cramer du budget pub alors ? par Nix's Blog le 07-02-2009, 15:31

- Soyons MVP ! par TheSaib .NET blog le 07-02-2009, 12:15

- SharePoint : Gestion des Erreurs 6398, 7076 et 6482 par Blog Technique de Romelard Fabrice le 07-02-2009, 11:53

- EF avec WPF par Matthieu MEZIL le 07-02-2009, 10:18