Spaziale - Code First

Nota

EF5 Onwards Only - Le funzionalità, le API e così via sono state introdotte in Entity Framework 5. Se si usa una versione precedente, le informazioni qui riportate, o parte di esse, non sono applicabili.

Il video e la procedura dettagliata illustra come eseguire il mapping dei tipi spaziali con Entity Framework Code First. Illustra anche come usare una query LINQ per trovare una distanza tra due posizioni.

Questa procedura dettagliata userà Code First per creare un nuovo database, ma è anche possibile usare Code First per un database esistente.

Il supporto del tipo spaziale è stato introdotto in Entity Framework 5. Si noti che per usare le nuove funzionalità come tipo spaziale, enumerazioni e funzioni con valori di tabella, è necessario destinazione .NET Framework 4.5. Visual Studio 2012 è destinato per impostazione predefinita a .NET 4.5.

Per usare i tipi di dati spaziali è necessario usare anche un provider Entity Framework con supporto spaziale. Per altre informazioni, vedere supporto del provider per i tipi spaziali .

Esistono due tipi di dati spaziali principali: geography e geometry. Il tipo di dati geography archivia i dati con i puntini di sospensione (ad esempio, coordinate di latitudine GPS e longitudine). Il tipo di dati geometry rappresenta il sistema di coordinate Euclidean (flat).

Video

Questo video illustra come eseguire il mapping dei tipi spaziali con Entity Framework Code First. Illustra anche come usare una query LINQ per trovare una distanza tra due posizioni.

Presentato da: Julia Kornich

Video: WMVMP4 | WMV | (ZIP)

Prerequisiti

Per completare questa procedura dettagliata, è necessario disporre di Visual Studio 2012, Ultimate, Premium, Professional o Web Express Edition.

Configurare il progetto

  1. Aprire Visual Studio 2012
  2. Scegliere Nuovo dal menu File e quindi fare clic su Progetto
  3. Nel riquadro sinistro fare clic su Visual C#e quindi selezionare il modello console
  4. Immettere SpatialCodeFirst come nome del progetto e fare clic su OK

Definire un nuovo modello usando code first

Quando si usa lo sviluppo Code First, in genere si inizia scrivendo classi .NET Framework che definiscono il modello concettuale (dominio). Il codice seguente definisce la classe Università.

L'Università ha la proprietà Location del tipo DbGeography. Per usare il tipo DbGeography, è necessario aggiungere un riferimento all'assembly System.Data.Entity e aggiungere anche l'istruzione System.Data.Spatial.

Aprire il file Program.cs e incollare le istruzioni using seguenti nella parte superiore del file:

using System.Data.Spatial;

Aggiungere la definizione della classe Università seguente al file Program.cs.

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

Definire il tipo derivato dbContext

Oltre a definire entità, è necessario definire una classe che deriva da DbContext ed espone le proprietà DbSet<TEntity> . Le proprietà DbSet<TEntity> consentono al contesto di conoscere i tipi da includere nel modello.

Un'istanza del tipo derivato DbContext gestisce gli oggetti di entità durante l'esecuzione, che include il popolamento di oggetti con dati da un database, il rilevamento delle modifiche e la conservazione dei dati nel database.

I tipi DbContext e DbSet sono definiti nell'assembly EntityFramework. Verrà aggiunto un riferimento a questa DLL usando il pacchetto NuGet EntityFramework.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto.
  2. Selezionare Gestisci pacchetti NuGet...
  3. Nella finestra di dialogo Gestisci pacchetti NuGet selezionare la scheda Online e scegliere il pacchetto EntityFramework .
  4. Fai clic su Install (Installa).

Si noti che, oltre all'assembly EntityFramework, viene aggiunto anche un riferimento all'assembly System.ComponentModel.DataAnnotations.

Nella parte superiore del file Program.cs aggiungere l'istruzione using seguente:

using System.Data.Entity;

In Program.cs aggiungere la definizione del contesto. 

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

Rendere persistenti e recuperare i dati

Aprire il file Program.cs in cui è definito il metodo Main. Aggiungere il codice seguente nella funzione Main.

Il codice aggiunge due nuovi oggetti Università al contesto. Le proprietà spaziali vengono inizializzate usando il metodo DbGeography.FromText. Il punto geography rappresentato come WellKnownText viene passato al metodo . Il codice salva quindi i dati. Quindi, la query LINQ che restituisce un oggetto University in cui la posizione è più vicina alla posizione specificata, viene creata ed eseguita.

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);
}

Compilare l'applicazione ed eseguirla. Il programma produce l'output seguente:

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

Visualizzare il database generato

Quando si esegue l'applicazione per la prima volta, Entity Framework crea un database. Poiché Visual Studio 2012 è installato, il database verrà creato nell'istanza di LocalDB. Per impostazione predefinita, Entity Framework assegna al database il nome completo del contesto derivato( in questo esempio è SpatialCodeFirst.UniversityContext). I tempi successivi in cui verrà usato il database esistente.  

Si noti che, se si apportano modifiche al modello dopo la creazione del database, è consigliabile usare Migrazioni Code First per aggiornare lo schema del database. Per un esempio di uso delle migrazioni, vedere Code First to a New Database (Code First to a New Database ) per un esempio di uso delle migrazioni.

Per visualizzare il database e i dati, eseguire le operazioni seguenti:

  1. Nel menu principale di Visual Studio 2012 selezionare Visualizza ->SQL Server Esplora oggetti.
  2. Se LocalDB non è incluso nell'elenco dei server, fare clic sul pulsante destro del mouse su SQL Server e selezionare Aggiungi SQL Server Usare l'autenticazione di Windows predefinita per connettersi all'istanza di LocalDB
  3. Espandere il nodo LocalDB
  4. Aprire la cartella Database per visualizzare il nuovo database e passare alla tabella Università
  5. Per visualizzare i dati, fare clic con il pulsante destro del mouse sulla tabella e selezionare Visualizza dati

Riepilogo

In questa procedura dettagliata è stato illustrato come usare i tipi spaziali con Entity Framework Code First.