Espacial: Code First

Nota:

Solo EF5 y versiones posteriores: las características, las API, etc. que se tratan en esta página se introdujeron en Entity Framework 5. Si usa una versión anterior, no se aplica parte o la totalidad de la información.

En el vídeo y en el tutorial paso a paso se muestra cómo asignar tipos espaciales con Code First de Entity Framework. También muestra cómo usar una consulta LINQ para buscar una distancia entre dos ubicaciones.

En este tutorial se usará Code First para crear una nueva base de datos, pero también puede usar Code First en una base de datos existente.

La compatibilidad con tipos espaciales se introdujo en Entity Framework 5. Tenga en cuenta que para usar las nuevas características, como el tipo espacial, las enumeraciones y las funciones con valores de tabla, debe tener como destino .NET Framework 4.5. Visual Studio 2012 usa .NET 4.5 de forma predeterminada.

Para usar tipos de datos espaciales, también debe usar un proveedor de Entity Framework que tenga compatibilidad espacial. Para obtener más información, consulte compatibilidad de proveedores con tipos espaciales.

Hay dos tipos de datos espaciales principales: geografía y geometría. El tipo de datos geografía almacena datos elipsoidales (por ejemplo, las coordenadas de latitud y longitud del sistema GPS). El tipo de datos geometría representa el sistema de coordenadas Euclidianos (la tierra plana).

Ver el vídeo

En este vídeo se muestra cómo asignar tipos espaciales con Code First de Entity Framework. También muestra cómo usar una consulta LINQ para buscar una distancia entre dos ubicaciones.

Presentado por: Julia Kornich

Vídeo: WMV | MP4 | WMV (ZIP)

Requisitos previos

Tendrá que tener instalada la edición Visual Studio 2012, Ultimate, Premium, Professional o Web Express para completar este tutorial.

Configuración del proyecto

  1. Abra Visual Studio 2012
  2. En el menú Archivo, elija Nuevo y haga clic en Proyecto
  3. En el panel izquierdo, haga clic en Visual C#y, luego, seleccione la plantilla Consola
  4. Escriba SpatialCodeFirst como nombre del proyecto y haga clic en Aceptar

Defina un nuevo modelo mediante Code First

Al usar el desarrollo de Code First, normalmente comienza escribiendo clases de .NET Framework que definen el modelo conceptual (dominio). El código siguiente define la clase University.

University tiene la propiedad Location del tipo DbGeography. Para usar el tipo DbGeography, debe agregar una referencia al ensamblado System.Data.Entity y agregar también la instrucción using System.Data.Spatial.

Abra el archivo Program.cs y pegue las siguientes instrucciones using en la parte superior del archivo:

using System.Data.Spatial;

Agregue la siguiente definición de clase University al archivo Program.cs.

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

Definir el tipo derivado de DbContext

Además de definir entidades, debe definir una clase que derive de DbContext y exponga las propiedades DbSet<TEntity>. Las propiedades DbSet<TEntity> permiten que el contexto sepa qué tipos desea incluir en el modelo.

Una instancia del tipo derivado de DbContext administra los objetos de entidad durante el tiempo de ejecución, lo que incluye rellenar los objetos con datos de una base de datos, el seguimiento de cambios y la persistencia de datos en la base de datos.

Los tipos DbContext y DbSet se definen en el ensamblado de EntityFramework. Agregaremos una referencia a este archivo DLL mediante el paquete EntityFramework NuGet.

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nombre del proyecto.
  2. Seleccione Administrar paquetes NuGet…
  3. En el cuadro de diálogo Administrar paquetes NuGet, seleccione la pestaña En línea y elija el paquete EntityFramework.
  4. Haz clic en Instalar

Tenga en cuenta que, además del ensamblado EntityFramework, también se agrega una referencia al ensamblado System.ComponentModel.DataAnnotations.

En la parte superior del archivo Program.cs, agregue la siguiente instrucción using:

using System.Data.Entity;

En Program.cs, agregue la definición de contexto. 

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

Conservar y recuperar datos

Abra el archivo Program.cs donde se define el método Main. Agregue el código siguiente a la función Main.

El código agrega dos nuevos objetos University al contexto. Las propiedades espaciales se inicializan mediante el método DbGeography.FromText. El punto geográfico representado como WellKnownText se pasa al método. A continuación, el código guarda los datos. A continuación, se construye y ejecuta la consulta LINQ que devuelve un objeto University cuya ubicación es la más cercana a la especificada.

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

Compile y ejecute la aplicación. El programa produce el siguiente resultado:

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

Visualizar la base de datos generada

Al ejecutar la aplicación por primera vez, Entity Framework crea una base de datos automáticamente. Dado que tenemos instalado Visual Studio 2012, la base de datos se creará en la instancia de LocalDB. De forma predeterminada, Entity Framework asigna un nombre a la base de datos después del nombre completo del contexto derivado (en este ejemplo es SpatialCodeFirst.UniversityContext). Las veces siguientes se utilizará la base de datos existente.  

Tenga en cuenta que, si realiza algún cambio en el modelo después de crear la base de datos, debe usar Migraciones de Code First para actualizar el esquema de la base de datos. Consulte Code First a una nueva base de datos para ver un ejemplo de uso de migraciones.

Para ver la base de datos y los datos, haga lo siguiente:

  1. En el menú principal de Visual Studio 2012, seleccione Ver ->Explorador de objetos de SQL Server.
  2. Si LocalDB no está en la lista de servidores, haga clic con el botón derecho en SQL Server y seleccione Agregar SQL Server Usar la autenticación de Windows predeterminada para conectarse a la instancia LocalDB
  3. Expanda el nodo LocalDB
  4. Despliegue la carpeta Bases de datos para ver la nueva base de datos y vaya a la tabla Universities
  5. Para ver los datos, haga clic con el botón derecho en la tabla y seleccione Ver datos

Resumen

En este tutorial hemos visto cómo usar tipos espaciales con Code First de Entity Framework.