Espacial – Designer de EF
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 mostram como mapear tipos espaciais com o Code First do Designer de Entity Framework. Ele também demonstra como usar uma consulta de LINQ para encontrar uma distância entre dois locais.
Este passo a passo usará o Model First para criar um novo banco de dados, mas o Designer de EF também poderá usado com o fluxo de trabalho Database 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, deverá 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, também deverá 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 de geografia armazena dados elipsoidais (por exemplo, coordenadas de latitude e longitude de GPS). O tipo de dados de geometria representa o sistema de coordenadas Euclideano (simples).
Assista ao vídeo
Esse vídeo mostra como usar tipos espaciais com o Designer de Entity Framework. Ele também demonstra como usar uma consulta de 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 selecione Projeto
- No painel esquerdo, selecione Visual C# e selecione o modelo de Console
- Insira SpatialEFDesigner como o nome do projeto e selecione OK
Criar um novo modelo usando o Designer de EF
- No Gerenciador de Soluções, clique com o botão direito do mouse no projeto, aponte para Adicionar e selecione Novo Item
- Selecione Dados no menu à esquerda e selecione Modelo de Dados de Entidade ADO.NET no painel Modelos
- Insira UniversityModel.edmx para o nome do arquivo e clique em Adicionar
- Na página Assistente de Modelo de Dados de Entidade, selecione Modelo Vazio na caixa de diálogo Escolher Conteúdo do Modelo
- Clique em Concluir
O Designer de Entity, que fornece uma superfície de design para editar seu modelo, é exibido.
O assistente executa as seguintes ações:
- Gera o arquivo EnumTestModel.edmx que define o modelo conceitual, o modelo de armazenamento e o mapeamento entre eles. Define a propriedade Processamento de Artefatos de Metadados do arquivo .edmx como Inserir no Assembly de Saída, para que os arquivos de metadados gerados sejam inseridos no assembly.
- Adiciona uma referência aos seguintes assemblies: EntityFramework, System.ComponentModel.DataAnnotations e System.Data.Entity.
- Cria arquivos UniversityModel.tt e UniversityModel.Context.tt e os adiciona no arquivo .edmx. Esses arquivos de modelo T4 geram o código que define o tipo derivado de DbContext e os tipos POCO que são mapeados para as entidades no modelo .edmx
Adicionar um novo tipo de entidade
- Clique com o botão direito do mouse em uma área vazia da superfície de design, selecione Adicionar –> Entidade, a caixa de diálogo Nova Entidade será exibida
- Especifique a University para o nome do tipo e especifique a UniversityID para o nome da propriedade chave, deixe o tipo como Int32
- Clique em OK
- Clique com o botão direito do mouse na entidade e selecione Adicionar Novo –> Propriedade Escalar
- Renomear a nova propriedade para Nome
- Adicione outra propriedade escalar e renomeie-a como Local Abra a janela Propriedades e altere o tipo da nova propriedade para Geografia
- Salvar o modelo e compilar o projeto
Observação
Ao compilar, talvez sejam exibidos avisos sobre entidades e associações não mapeadas na Lista de Erros. Ignore esses avisos, porque depois que optarmos por gerar o banco de dados com base no modelo, os erros desaparecerão.
Gerar banco de dados a partir do modelo
Agora podemos gerar um banco de dados baseado no modelo.
- Clique com o botão direito do mouse em um espaço vazio na superfície do Designer de Entidade e selecione Gerar Banco de Dados a partir do Modelo
- A caixa de diálogo Escolher a Conexão de Dados do Assistente para Gerar Banco de Dados é exibida, selecione Nova Conexão especifique (localdb)\mssqllocaldb para o nome do servidor e University para o banco de dados e selecione OK
- Uma caixa de diálogo perguntando se deseja criar um novo banco de dados será exibida, selecione Sim.
- Selecione Avançar e o Assistente para Criar Banco de Dados gera a DDL (linguagem de definição de dados), para criar um banco de dados. A DDL gerada é exibida na caixa de diálogo Resumo e Configurações, observe que a DDL não contém uma definição para uma tabela mapeada para o tipo de enumeração
- Selecione Concluir, ao selecionar Concluir não executa o script da DDL.
- O Assistente para Criar Banco de Dados faz o seguinte: Abre o UniversityModel.edmx.sql no Editor T-SQL. Gera o esquema do repositório e as seções de mapeamento do arquivo EDMX. Adiciona informações de cadeia de conexão ao arquivo App.config
- Clique com o botão direito do mouse no Editor do T-SQL e selecione Executar A caixa de diálogo Conectar ao Servidor é exibida, insira as informações de conexão da etapa 2 e selecione Conectar
- Para exibir o esquema gerado, clique com o botão direito do mouse no nome do banco de dados no Pesquisador de Objetos do SQL Server e selecione Atualizar
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 do University ao contexto. As propriedades espaciais são inicializadas com o método DbGeography.FromText. O ponto de geografia representado como WellKnownText é passado para o método. O código salva os dados. Em seguida, a consulta de LINQ que retorna um objeto do University onde sua localização está mais próxima do local especificado é construída e executada.
using (var context = new UniversityModelContainer())
{
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.
Para exibir dados no banco de dados, clique com o botão direito do mouse no nome do banco de dados no Pesquisador de Objetos do SQL Server e selecione Atualizar. Em seguida, clique no botão direito do mouse na tabela e selecione Exibir dados.
Resumo
Neste passo a passo, analisamos como mapear tipos espaciais usando o Designer de Entity Framework e como usar tipos espaciais no código.