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
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
- Abra o Visual Studio 2012
- No menu Arquivo, aponte para Novo e clique em Projeto
- No painel esquerdo, clique em Visual C#e selecione o modelo de Console
- 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.
- No Gerenciador de Soluções, clique com o botão direito do mouse no nome do projeto.
- Selecione Gerenciar Pacotes NuGet...
- Na caixa de diálogo Gerenciar Pacotes NuGet, selecione a guia Online e escolha o pacote EntityFramework.
- 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:
- No menu principal do Visual Studio 2012, selecione Exibir ->Pesquisador de Objetos SQL Server.
- 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
- Expandir o nó LocalDB
- Desdobre a pasta Bancos de Dados para ver o novo banco de dados e navegue até a tabela Universidades
- 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.