Spaziale - Code First

Nota

Solo EF5 e versioni successive : le funzionalità, le API e così via descritte in questa pagina 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 illustrano come eseguire il mapping dei tipi spaziali con Entity Framework Code First. Viene inoltre illustrato 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 in un database esistente.

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

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 ellissoidali , ad esempio coordinate di latitudine e longitudine GPS. Il tipo di dati geometry rappresenta il sistema di coordinate Euclidean (flat).

Guarda il video

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

Presentato da: Julia Kornich

Video: WMV | MP4 | WMV (ZIP)

Prerequisiti

Per completare questa procedura dettagliata, è necessario avere installato 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#, 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 University.

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 Using System.Data.Spatial.

Aprire il file Program.cs e incollare le istruzioni using seguenti all'inizio del file:

using System.Data.Spatial;

Aggiungere la definizione di classe University 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 le 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 entità durante l'esecuzione, che include il popolamento di oggetti con dati di un database, il rilevamento delle modifiche e la persistenza 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 alla funzione Main.

Il codice aggiunge due nuovi oggetti University al contesto. Le proprietà spaziali vengono inizializzate usando il metodo DbGeography.FromText. Il punto geografico 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 costruita 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 automaticamente un database. Poiché Visual Studio 2012 è installato, il database verrà creato nell'istanza di Local DB. Per impostazione predefinita, Entity Framework denomina il database dopo il nome completo del contesto derivato (in questo esempio SpatialCodeFirst.UniversityContext). Le volte successive in cui verrà utilizzato 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 in un nuovo database .

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 Local DB non è presente nell'elenco dei server, fare clic sul pulsante destro del mouse in SQL Server e selezionare Aggiungi SQL Server Usare l'autenticazione di Windows predefinita per connettersi all'istanza di Local DB
  3. Espandere il nodo Local DB
  4. Espandere 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.