O Entity Framework é um framework de Mapeamento Objeto-Relacional (ORM) capaz de trabalhar com diversos bancos de dados. Isso é possível graças à sua estrutura interna, que usa o ADO.NET, um conjunto de classes e interfaces para acesso a bancos de dados em .NET, como ilustra a Figura 1.

Estrutura de funcionamento do Entity Framework
Figura 1. Estrutura de funcionamento do Entity Framework

Para trabalhar um determinado banco o EF usa o provider adequado, que implementa as interfaces do ADO.NET, como mostra a Figura 2.

Providers do ADO.NET
Figura 2. Providers do ADO.NET

Graças a essa estrutura podemos trabalhar com diferentes SGBDs alterando basicamente o provider utilizado, pois o Entity Framework abstrai toda a complexidade da decisão sobre quais classes utilizar para cada banco.

Instalando o Entity Framework

Para trabalhar com o PostgreSQL precisamos instalar o pacote EntityFramework6.Npgsql via NuGet. Automaticamente serão instaladas duas dependências: o próprio EntityFramework e o Npgsql que é o provider do ADO.NET para PostgreSQL, como ilustra a sequência de imagens a seguir:

Abrindo o NuGet Instalando o pacote EntityFramework6.Npgsql Pacotes instalados

Configurando o acesso ao banco

Após instalar os pacotes necessários precisamos registrar no arquivo de configurações da aplicação (App.config ou Web.config) o DbProviderFactory referente ao uso do PostgreSQL. Esse é um elemento próprio da arquitetura do EF que implementa o padrão de projeto Abstract Factory e indica quais classes devem ser usadas para acesso ao banco de dados:

  <system.data>
     <DbProviderFactories>
         <add name="Npgsql Data Provider"
             invariant="Npgsql"
             description=".Net Data Provider for PostgreSQL"
             type="Npgsql.NpgsqlFactory, Npgsql"
             support="FF" />
     </DbProviderFactories>
  </system.data>

Por fim podemos definir a string de conexão seguindo os padrões do PostgreSQL:

  <connectionStrings>
  <add name="PgProdutos"
      connectionString="server=localhost;Port=5432;user id=postgres;
      password=abcd1234;database=DbProdutos"
      providerName="Npgsql" />
  </connectionStrings>

A partir daí o uso do Entity Framework é igual para todos os bancos. Ou seja, podemos usar a classes DbContext, DbSet, Data Annotations, etc. Por exemplo, o DbContext para essa aplicação deve referenciar a string de conexão:

  public class ProdutosContext:DbContext
  {
        public ProdutosContext():base("PgProdutos")
        {
        }
   
        public DbSet<Produto> Produtos { get; set; }
  }

Ao ler ou escrever dados na coleção Produtos a tabela será criada no banco, caso não exista.