Spatial – Code First

Remarque

EF5 et ultérieur uniquement : les fonctionnalités, les API, etc. décrites dans cette page ont été introduites dans Entity Framework 5. Si vous utilisez une version antérieure, certaines ou toutes les informations ne s’appliquent pas.

La vidéo et la procédure pas à pas montrent comment mapper des types spatiaux avec l’approche Code First d’Entity Framework. Elle montre également comment utiliser une requête LINQ pour trouver une distance entre deux emplacements.

Cette procédure pas à pas utilise Code First pour créer une base de données, mais vous pouvez aussi utiliser Code First sur une base de données existante.

La prise en charge du type spatial a été introduite dans Entity Framework 5. Notez que pour utiliser les nouvelles fonctionnalités comme le type spatial, les énumérations et les fonctions table, vous devez cibler .NET Framework 4.5. Visual Studio 2012 cible .NET 4.5 par défaut.

Pour utiliser des types de données spatiales, vous devez également utiliser un fournisseur Entity Framework qui a une prise en charge du type spatial. Pour plus d’informations, consultez Prise en charge des types spatiaux par les fournisseurs.

Il existe deux types principaux de données spatiales : de géographie et de géométrie. Le type de données de géographie stocke des données ellipsoïdales (par exemple les coordonnées de latitude et de longitude GPS). Le type de données de géométrie représente le système de coordonnées euclidien (plat).

Regardez la vidéo

Cette vidéo montre comment mapper des types spatiaux avec Code First d’Entity Framework. Elle montre également comment utiliser une requête LINQ pour trouver une distance entre deux emplacements.

Présenté par : Julia Kornich

Vidéo : WMV | MP4 | WMV (ZIP)

Conditions préalables

Vous devez disposer de Visual Studio 2012, Ultimate, Premium, Professionnel ou Web Express Edition installé pour effectuer cette procédure pas à pas.

Configurer le projet

  1. Ouvrir Visual Studio 2012
  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet
  3. Dans le volet de gauche, cliquez sur Visual C#, puis sélectionnez le modèle Console
  4. Entrez SpatialCodeFirst comme nom du projet, puis cliquez sur OK

Définir un nouveau modèle en utilisant Code First

Quand vous utilisez le développement Code First, vous commencez généralement par écrire des classes .NET Framework qui définissent votre modèle (domaine) conceptuel. Le code ci-dessous définit la classe University (Université).

L’Université a la propriété Location (Emplacement) du type DbGeography. Pour utiliser le type DbGeography, vous devez ajouter une référence à l’assembly System.Data.Entity et également ajouter l’instruction using System.Data.Spatial.

Ouvrez le fichier Program.cs et collez les instructions using suivantes en haut du fichier :

using System.Data.Spatial;

Ajoutez la définition de la classe University suivante au fichier Program.cs.

public class University  
{
    public int UniversityID { get; set; }
    public string Name { get; set; }
    public DbGeography Location { get; set; }
}

Définir le type dérivé de DbContext

En plus de définir des entités, vous devez définir une classe qui dérive de DbContext et expose les propriétés DbSet<TEntity>. Les propriétés DbSet<TEntity> indiquent au contexte quels types vous voulez inclure dans le modèle.

Une instance du type dérivé de DbContext gère les objets d’entité au moment de l’exécution, ce qui comprend le remplissage des objets avec les données d’une base de données, le suivi des modifications et la conservation des données dans la base de données.

Les types DbContext et DbSet sont définis dans l’assembly EntityFramework. Nous allons ajouter une référence à cette DLL en utilisant le package NuGet EntityFramework.

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet.
  2. Sélectionnez Gérer les packages NuGet…
  3. Dans la boîte de dialogue Gérer les packages NuGet, sélectionnez l’onglet En ligne, puis choisissez le package EntityFramework.
  4. Cliquez sur Install.

Notez qu’en plus de l’assembly EntityFramework, une référence à System.ComponentModel.DataAnnotations est également ajoutée.

En haut du fichier Program.cs, ajoutez l’instruction using suivante :

using System.Data.Entity;

Dans Program.cs, ajoutez la définition de contexte. 

public partial class UniversityContext : DbContext
{
    public DbSet<University> Universities { get; set; }
}

Conserver et récupérer des données

Ouvrez le fichier Program.cs où la méthode Main est définie. Ajoutez le code suivant dans la fonction Main.

Le code ajoute deux nouveaux objets University au contexte. Les propriétés spatiales sont initialisées en utilisant la méthode DbGeography.FromText. Le point géographique représenté en tant que WellKnownText est passé à la méthode. Le code enregistre ensuite les données. Ensuite, la requête LINQ qui retourne un objet University où son emplacement est le plus proche de l’emplacement spécifié est construite et exécutée.

using (var context = new UniversityContext ())
{
    context.Universities.Add(new University()
        {
            Name = "Graphic Design Institute",
            Location = DbGeography.FromText("POINT(-122.336106 47.605049)"),
        });

    context. Universities.Add(new University()
        {
            Name = "School of Fine Art",
            Location = DbGeography.FromText("POINT(-122.335197 47.646711)"),
        });

    context.SaveChanges();

    var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");

    var university = (from u in context.Universities
                        orderby u.Location.Distance(myLocation)
                        select u).FirstOrDefault();

    Console.WriteLine(
        "The closest University to you is: {0}.",
        university.Name);
}

Compilez et exécutez l'application. Le programme génère la sortie suivante :

The closest University to you is: School of Fine Art.

Visualiser la base de données générée

Quand vous exécutez l’application la première fois, Entity Framework crée une base de données pour vous. Comme nous disposons de Visual Studio 2012, la base de données est créée sur l’instance LocalDB. Par défaut, Entity Framework nomme la base de données d’après le nom complet du contexte dérivé (dans cet exemple, il s’agit de SpatialCodeFirst.UniversityContext). Les prochaines fois, la base de données existante sera utilisée.  

Notez que si vous apportez des modifications à votre modèle après la création de la base de données, vous devez utiliser Migrations Code First pour mettre à jour le schéma de base de données. Consultez Code First pour une nouvelle base de données pour obtenir un exemple d’utilisation de Migrations.

Pour visualiser la base de données et les données, procédez comme suit :

  1. Dans le menu principal de Visual Studio 2012, sélectionnez Affichage ->Explorateur d’objets SQL Server.
  2. Si LocalDB n’est pas dans la liste des serveurs, cliquez avec le bouton droit sur SQL Server, puis sélectionnez Ajouter SQL Server Utiliser l’Authentification Windows par défaut pour vous connecter à l’instance LocalDB
  3. Développer le nœud LocalDB
  4. Développez le dossier Bases de données pour voir la nouvelle base de données et accédez à la table Universities.
  5. Pour visualiser les données, cliquez avec le bouton droit sur la table, puis sélectionnez Afficher les données.

Résumé

Dans cette procédure pas à pas, nous avons examiné comment utiliser des types spatiaux avec Code First d’Entity Framework.