Share via


Espacial - Code First

Observação

Apenas a partir do EF5 : os recursos, as APIs etc. discutidos nessa página foram introduzidos no Entity Framework 5. Se você estiver usando uma versão anterior, algumas ou todas as informações não se aplicarão.

Esse vídeo e passo a passo mostra como mapear tipos espaciais com o Code First do Entity Framework. Ele também demonstra como usar uma consulta LINQ para encontrar uma distância entre dois locais.

Esse passo a passo usará o Code First para criar um novo banco de dados, mas você também pode usar o Code First para mapear para um banco de dados existente.

O suporte ao tipo espacial foi introduzido no Entity Framework 5. Observe que para usar os novos recursos como tipo espacial, enumerações e funções com valor de tabela, você deve direcionar o .NET Framework 4.5. O Visual Studio 2012 tem como destino o .NET 4.5 por padrão.

Para usar tipos de dados espaciais, você também deve usar um provedor do Entity Framework que tenha suporte espacial. Consulte o suporte do provedor para tipos espaciais para obter mais informações.

Há dois tipos de dados espaciais principais: geografia e geometria. O tipo de dados geografia armazena dados elipsoidais (por exemplo, coordenadas de latitude e longitude de GPS). O tipo de dados geometria representa o sistema de coordenadas Euclideano (simples).

Assista ao vídeo

Esse vídeo mostra como usar tipos espaciais com o Code First do Entity Framework. Ele também demonstra como usar uma consulta LINQ para encontrar uma distância entre dois locais.

Apresentado por: Julia Kornich

Video: WMV | MP4 | WMV (ZIP)

Pré-Requisitos

Você precisará ter o Visual Studio 2012, Ultimate, Premium, Professional ou Web Express Edition instalado para concluir esse passo a passo.

Configurar o Projeto

  1. Abra o Visual Studio 2012
  2. No menu Arquivo, aponte para Novo e clique em Projeto
  3. No painel esquerdo, clique em Visual C#e selecione o modelo de Console
  4. Insira SpatialCodeFirst como o nome do projeto e clique em OK

Defina um novo modelo usando o Code First

Ao usar o desenvolvimento Code First, você geralmente começa escrevendo classes do .NET Framework que definem seu modelo conceitual (domínio). O código a seguir define a classe University.

A Universidade tem a propriedade Location do tipo DbGeography. Para usar o tipo DbGeography, você deve adicionar uma referência ao assembly System.Data.Entity e também adicionar a instrução System.Data.Spatial using.

Abra o arquivo Program.cs e cole o seguinte usando instruções na parte superior do arquivo:

using System.Data.Spatial;

Adicione a seguinte definição de classe University ao arquivo Program.cs.

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

Como definir o tipo derivado de DbContext

Além de definir entidades, você precisa definir uma classe que deriva de DbContext e expõe as propriedades DbSet<TEntity>. As propriedades DbSet<TEntity> informam ao contexto quais tipos você deseja incluir no modelo.

Uma instância do tipo derivado DbContext gerencia os objetos de entidade durante o tempo de execução, o que inclui preencher objetos com dados de um banco de dados, controle de alterações e persistência de dados no banco de dados.

Os tipos DbContext e DbSet são definidos no assembly EntityFramework. Adicionaremos uma referência a essa DLL usando o pacote NuGet EntityFramework.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no nome do projeto.
  2. Selecione Gerenciar Pacotes NuGet...
  3. Na caixa de diálogo Gerenciar Pacotes NuGet, selecione a guia Online e escolha o pacote EntityFramework.
  4. Clique em Instalar

Além do assembly EntityFramework, também é adicionada uma referência a System.ComponentModel.DataAnnotations.

Na parte superior do arquivo Program.cs, adicione a seguinte instrução using:

using System.Data.Entity;

No Program.cs, adicione a definição de contexto. 

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

Persistir e recuperar dados

Abra o arquivo Program.cs em que o método Principal está definido. Adicione o código a seguir à função Principal.

O código adiciona dois novos objetos University ao contexto. As propriedades espaciais são inicializadas usando o método DbGeography.FromText. O ponto de geografia representado como WellKnownText é passado para o método. Em seguida, o código salva os dados. Em seguida, a consulta LINQ que retorna um objeto da Universidade onde sua localização está mais próxima do local especificado é construída e executada.

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 e execute o aplicativo. O programa produz a seguinte saída:

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

Como exibir o banco de dados gerado

Quando você executa o aplicativo pela primeira vez, o Entity Framework cria um banco de dados para você. Como temos o Visual Studio 2012 instalado, o banco de dados será criado na instância do LocalDB. Por padrão, o Entity Framework nomeia o banco de dados após o nome totalmente qualificado do contexto derivado (para esse exemplo, ele é EnumCodeFirst.EnumTestContext). As horas subsequentes em que o banco de dados existente será usado.  

Observe que, se você fizer alterações no modelo após a criação do banco de dados, deverá usar as Migrações do Code First para atualizar o esquema de banco de dados. Consulte Code First para um Novo Banco de Dados para obter um exemplo de como usar migrações.

Para exibir o banco de dados e os dados, faça o seguinte:

  1. No menu principal do Visual Studio 2012, selecione Exibir ->Pesquisador de Objetos SQL Server.
  2. Se o LocalDB não estiver na lista de servidores, clique no botão direito do mouse no SQL Server e selecione Adicionar SQL Server Use a Autenticação padrão do Windows para se conectar à instância do LocalDB
  3. Expandir o nó LocalDB
  4. Desdobre a pasta Bancos de Dados para ver o novo banco de dados e navegue até a tabela Universidades
  5. Clique com o botão direito do mouse na tabela e selecione Exibir dados

Resumo

Nesse passo a passo, analisamos como usar tipos espaciais com o Code First do Entity Framework.