Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Comment mapper une vue SQL sur une collection de complex type?

Avec EF, les vues doivent être mappées sur des entity types.

Le problème c’est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n’ont pas de clé mais les vues ne peuvent pas être mappées dessus.

Avec EF4, il est possible de mapper les SSDL Functions sur une collection de complex types. Les SSDL Functions sont généralement utilisées pour les procédures stockées mais il est également possible de définir soit même le SQL dans le SSDL.

Par défaut, EF utilise l’ensemble des colonnes non nullable comme clé quand il n’y a pas de clé (ce qui est toujours le cas avec les vues).

Mon idée est donc d’utiliser une SSDL Function dans le but de mapper ma vue sur un complex type.

Tout d’abord, nous allons importer la vue depuis la base. Dans mon exemple, Invoices de Northwind.

Ensuite j’ouvre l’edmx en xml et je supprime toutes les clés de l’entity type CSDL Invoice. // Cela peut aussi se faire par le designer mais propriété par propriété avec la property window.

Ensuite, j’ouvre l’edmx avec le designer. Je sélectionne l’ensemble des propriétés de l’entity type Invoice, puis je fais un click droit et Refactor into New Complex Type.

Ensuite, je supprime l’entity type Invoice et je refuse de supprimer également le SSDL type Invoices.

Je renomme mon nouveau Complex Type en Invoice.

Ensuite, j’ouvre l’edmx en xml.

Je copie la requête SQL EntitySet SSDL Invoices (générée lors de l’import de la vue) :

<EntitySet Name="Invoices" EntityType="MyNorthwindEFModel.Store.Invoices" store:Type="Views" store:Schema="dbo" store:Name="Invoices">
  <DefiningQuery>
    SELECT 
    [Invoices].[ShipName] AS [ShipName], 
    [Invoices].[ShipAddress] AS [ShipAddress], 
    [Invoices].[ShipCity] AS [ShipCity], 
    [Invoices].[ShipRegion] AS [ShipRegion], 
    [Invoices].[ShipPostalCode] AS [ShipPostalCode], 
    [Invoices].[ShipCountry] AS [ShipCountry], 
    [Invoices].[CustomerID] AS [CustomerID], 
    [Invoices].[CustomerName] AS [CustomerName], 
    [Invoices].[Address] AS [Address], 
    [Invoices].[City] AS [City], 
    [Invoices].[Region] AS [Region], 
    [Invoices].[PostalCode] AS [PostalCode], 
    [Invoices].[Country] AS [Country], 
    [Invoices].[Salesperson] AS [Salesperson], 
    [Invoices].[OrderID] AS [OrderID], 
    [Invoices].[OrderDate] AS [OrderDate], 
    [Invoices].[RequiredDate] AS [RequiredDate], 
    [Invoices].[ShippedDate] AS [ShippedDate], 
    [Invoices].[ShipperName] AS [ShipperName], 
    [Invoices].[ProductID] AS [ProductID], 
    [Invoices].[ProductName] AS [ProductName], 
    [Invoices].[UnitPrice] AS [UnitPrice], 
    [Invoices].[Quantity] AS [Quantity], 
    [Invoices].[Discount] AS [Discount], 
    [Invoices].[ExtendedPrice] AS [ExtendedPrice], 
    [Invoices].[Freight] AS [Freight]
    FROM [dbo].[Invoices] AS [Invoices]
  </DefiningQuery>
</EntitySet>

Ensuite, je supprime cet entity set avec son entity type (SSDL) Invoices.

Ensuite, j’ajoute la SSDL Function suivante :

<Function Name="GetInvoices" IsComposable="false">
  <CommandText>
    SELECT
    [Invoices].[ShipName] AS [ShipName],
    [Invoices].[ShipAddress] AS [ShipAddress],
    [Invoices].[ShipCity] AS [ShipCity],
    [Invoices].[ShipRegion] AS [ShipRegion],
    [Invoices].[ShipPostalCode] AS [ShipPostalCode],
    [Invoices].[ShipCountry] AS [ShipCountry],
    [Invoices].[CustomerID] AS [CustomerID],
    [Invoices].[CustomerName] AS [CustomerName],
    [Invoices].[Address] AS [Address],
    [Invoices].[City] AS [City],
    [Invoices].[Region] AS [Region],
    [Invoices].[PostalCode] AS [PostalCode],
    [Invoices].[Country] AS [Country],
    [Invoices].[Salesperson] AS [Salesperson],
    [Invoices].[OrderID] AS [OrderID],
    [Invoices].[OrderDate] AS [OrderDate],
    [Invoices].[RequiredDate] AS [RequiredDate],
    [Invoices].[ShippedDate] AS [ShippedDate],
    [Invoices].[ShipperName] AS [ShipperName],
    [Invoices].[ProductID] AS [ProductID],
    [Invoices].[ProductName] AS [ProductName],
    [Invoices].[UnitPrice] AS [UnitPrice],
    [Invoices].[Quantity] AS [Quantity],
    [Invoices].[Discount] AS [Discount],
    [Invoices].[ExtendedPrice] AS [ExtendedPrice],
    [Invoices].[Freight] AS [Freight]
    FROM [dbo].[Invoices] AS [Invoices]
  </CommandText>
</Function>

Maintenant, je ré-ouvre l’edmx avec le designer.

Dans le fenêtre model browser, dans Northwind.Store / Stored Procedures, click droit sur GetInvoies / Add Function Import.

Spécifier que le fonction retourne une collection de complex type Invoice.

Here we are.

Je peux maintenant utiliser ma vue Invoices mappée sur mon complex type.

using (var context = new NorthwindEntities())
{
    List<Invoice> invoices = context.GetInvoices().ToList();
}

Cependant, cette solution n’est pas parfaite car je ne pourrai pas utiliser ma méthode GetInvoides dans le cadre d’une requête LINQ To Entities.

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é vendredi 19 mars 2010 21:05 par Matthieu MEZIL

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [SharePoint] Les sessions TechDays 2012… par Le blog de Patrick [MVP SharePoint] le il y a 6 heures et 37 minutes

- TechDays Paris 2012 : Session pleinière jour 3 par Blog Technique de Romelard Fabrice le 02-09-2012, 11:01

- Mishra Reader : un lecteur RSS très Zune Style en Open Source ! par Cyril Sansus le 02-09-2012, 08:28

- [framework 4] Les Tasks et le Thread UI par Fathi Bellahcene le 02-09-2012, 00:33

- Workflow Foundation 3 a un pied dans la tombe par Blog de Jérémy Jeanson le 02-08-2012, 22:15

- TechDays Paris 2012 : Nouvelles tendances du poste de travail - Bring Your own PC par Blog Technique de Romelard Fabrice le 02-08-2012, 19:42

- TechDays Paris 2012 : System Center Service Manager 2012 Vue d’ensemble par Blog Technique de Romelard Fabrice le 02-08-2012, 17:32

- TechDays Paris 2012 : Pleinière second jour par Blog Technique de Romelard Fabrice le 02-08-2012, 16:23

- TechDays Paris 2012 : Retour d'expérience sur la mise en place d'un Cloud Privé par Blog Technique de Romelard Fabrice le 02-08-2012, 16:04

- TechDays Paris 2012 : Comment SharePoint a sauvé mes TechDays par Blog Technique de Romelard Fabrice le 02-07-2012, 23:59