Entity Framework - Vitor-Xavier/DemoWebApi GitHub Wiki
O Entity Framework é uma ferramenta de mapeamento objeto relacional, que elimina a necessidade de se trabalhar com código SQL, pois no Entity os dados são manipulados através de classes mapeadas com tabelas do banco de dados, onde a tradução é totalmente realizada pelo Entity, embora seja possível enviar comandos SQL diretamente.
Para utilizar os recursos do Entity Framework é necessário adicionar o pacote Nuget Entity Framework que pode ser feito pelo Package Manager Console do Nuget pelo comando abaixo, ou por sua interface visual disponível do Gerenciador de pacotes do NuGet buscando por Entity Framework e realizando a instalação no projeto.
Package Manager Console
Install-Package EntityFramework
Gerenciador de pacotes do Nuget
Após instalar o pacote é necessário informar ao Entity qual conexão será utilizada para realizar o mapeamento do, ou para, o banco de dados e realizar suas operações, assim no arquivo Web.config adicione uma connection string conforme trecho de código a seguir, e insira o providerName para o banco utilizado e indique ao final da connectionString que o EntityFramework utilizará essa conexão:
App=EntityFramework
Neste exemplo será utilizado o padrão Code First e o banco de dados SQL Server, porém existem demais técnicas para se trabalhar com este framework, tutorial sobre esse padrão e convenções disponíveis em Code First.
<configuration>
...
<connectionStrings>
<add name="LOCALDB" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=BDTESTEAPI;User ID=sa;Password=123456;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
...
</configuration>
Feito isso só é necessário definir o contexto do banco de dados e as classes de entidade que o Entity utilizará no mapeamento, uma classe de entidade é uma classe comum de modelo, porém é aconselhável utilizar alguns padrões de nomenclatura definidos pelo Entity, que podem ser encontrados em Entity Framework Code First ou mesmo adicionar Data Annotations para especificar as propriedades.
[Table("tb_teste")]
public class Teste
{
[Key]
public int TesteId { get; set; }
[Column("nome_teste")]
public string Nome { get; set; }
Sobre a contexto do banco é considerado boa prática adicionar uma pasta 'Context' para comportar a classe de contexto, que deve herdar de DbContext e em seu contrutor chamar o construtor da classe base passado como parâmetro o nome da connection string definida no Web.config, exemplo base(" name = LOCALDB "), e na classe definir quais classes devem ser mapeadas com o DbSet.
using System.Data.Entity;
using TesteOAuth.Models;
namespace TesteOAuth.Context
{
public class DatabaseContext : DbContext
{
public DatabaseContext() : base(" name = LOCALDB ") { }
public virtual DbSet<Categoria> Categorias { get; set; }
public virtual DbSet<Teste> Testes { get; set; }
}
}
Para utilizar os recursos do Entity Framework com o PostgreSQL existem algumas diferenças cruciais durante a configuração da conexão e provedores de acesso, sendo assim os pacotes necessários para criar a conexão são:
Entity Framework 6 Provider, este pacote deve adicionar os outros dois abaixo como dependência.
Install-Package EntityFramework6.Npgsql
Install-Package EntityFramework
Install-Package Npgsql
Já que para a conexão com o PostgreSQL a única diferença é o provedor de acesso aos dados o possível esquema público utilizado como padrão no PostgreSQL, sendo que os demais detalhes do mapeamento não se alteram somente a parte de configurações e pacotes será abordada do o PostgreSQL.
Na classe de configurações, Web.config, é necessário configurar além da connection string configurar o provedor de conexão aos dados e referencia-lo para ser utilizado pelo Entity Framework também através de um provedor para o que seja possível o mapeamento. Crie o provedor de acesso a ser utilizado para a conexão com o banco.
<system.data>
<DbProviderFactories>
<remove invariant="Npgsql" />
<add name="Npgsql Data Provider" invariant="Npgsql" description="Data Provider for PostgreSQL" type="Npgsql.NpgsqlFactory, Npgsql" />
</DbProviderFactories>
</system.data>
Ainda em Web.config, dentro da tag providers, criada após instalar o pacote do Entity Framework adicione o provedor do PostgreSQL nas referências do Entity Framework, que irá fornecer o meio de conexão para o banco de dados.
<provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, EntityFramework6.Npgsql" />
Por fim a connection string, que segue modelo padrão para conexões ao PostgreSQL, somente deve ser adicionado o nome do provedor para Npgsql, com isso as alterações na classe Web.config estão encerradas para a conexão de dados.
<connectionStrings>
<add name="LOCALDB" connectionString="User ID=postgres;Password=senha123;Host=localhost;Port=5432;Database=BDTESTEAPI;Pooling=true;" providerName="Npgsql" />
</connectionStrings>
O PostgreSQL utiliza o esquema público como padrão, diferente do Entity Framework que tem como padrão o dbo, portanto caso o banco de dados esteja operando em tal modo altere a classe de contexto do banco de dados chamando o seguinte método para alterar o esquema padrão para o público.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
base.OnModelCreating(modelBuilder);
}