Certas vezes é inviável contar com um banco de dados pago quando o projeto está iniciando. Mas nem por isso não será preciso que seja um repositório de dados profissional. Portanto, neste artigo ensino como usar o banco de dados relacional PostgresSQL com o .NET Core 2.1, ainda usando Entity Framework Core e Migrations.
Antes de começar você vai precisar:
- Ter o PostgreSQL instalado, com a senha do localhost como 123456,
- Ter o Visual Studio Code intalado,
- Ter o .NET Core 2.1 SDK instalado.
Criando o projeto
Crie uma pasta vazia chamada PostgreSqlNetCore e dentro dela crie uma outra chamada src. E na pasta raíz, crie o arquivo da solução, usando o comando:
1 |
dotnet new sln |
Abra a a pasta src e crie dentro dela a pasta PostgreSqlNetCore.Domain, e neste diretório execute o comando abaixo para criar o projeto do domínio:
1 |
dotnet new classlib |
Crie uma pasta chamada Entities, e adicione duas classes, uma de pessoa e outra de categoria.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; namespace PostgreSqlNetCore.Domain.Entities { public class Person { public Person(Guid id, string name, Guid categoryId) { Id = id; Name = name; CategoryId = categoryId; } public Guid Id { get; private set; } public string Name { get; private set; } public Guid CategoryId { get; private set; } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; namespace PostgreSqlNetCore.Domain.Entities { public class Category { public Category(Guid id, string description) { Id = id; Description = description; } public Guid Id { get; private set; } public string Description { get; private set; } } } |
Agora vamos criar o projeto que conterá nossa camada de acesso a dados, migrations e CRUD. Abra a a pasta src e crie dentro dela a pasta PostgreSqlNetCore.Infra.Data, e neste diretório execute o comando abaixo para criar o projeto de domínio:
1 |
dotnet new classlib |
Instale os pacotes conforme a seguir:
Npgsql.EntityFrameworkCore.PostgreSQL
1 |
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL |
Microsoft.Extensions.Configuration.FileExtensions
1 |
dotnet add package Microsoft.Extensions.Configuration.FileExtensions |
Microsoft.Extensions.Configuration.Json
1 |
dotnet add package Microsoft.Extensions.Configuration.Json |
Adicione a referência ao projeto de domínio, com o comando:
1 |
dotnet add reference ..\PostgreSqlNetCore.Domain\ |
Crie uma pasta chamada Context, e adicione uma classe chamada PostgreSqlContext.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; using Microsoft.EntityFrameworkCore; using PostgreSqlNetCore.Domain.Entities; using Microsoft.Extensions.Configuration; using System.IO; namespace PostgreSqlNetCore.Infra.Data.Context { public class PostgreSqlContext : DbContext { private readonly IConfigurationRoot _configurationFile; private readonly string _connectionString; public PostgreSqlContext(DbContextOptions<PostgreSqlContext> options) : base(options) { _configurationFile = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); _connectionString = _configurationFile .GetConnectionString("PostgreSqlNetCoreConnection"); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(_connectionString); base.OnConfiguring(optionsBuilder); } public DbSet<Person> People { get; set; } public DbSet<Category> Categories { get; set; } } } |
Abra a a pasta src e crie dentro dela a pasta PostgreSqlNetCore.Prompt, e neste diretório execute o comando abaixo para criar o projeto de domínio:
1 |
dotnet new console |
Instale o pacote Microsoft.EntityFrameworkCore.Design.
1 |
dotnet add package Microsoft.EntityFrameworkCore.Design |
Adicione referência ao projeto de Dados.
1 |
dotnet add reference ..\PostgreSqlNetCore.Infra.Data\ |
Na raiz do projeto, adicione um arquivo chamado appsettings.json, e altere conforme a seguir:
1 2 3 4 5 6 |
{ "ConnectionStrings": { "PostgreSqlNetCoreConnection": "Host=localhost;Port=5432;Username=postgres;Password=123456;Database=PostgreSqlNetCoreDb;" } } |
Adicione ainda na raiz do projeto a classe DesignTimeDbContextFactory.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System.IO; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using PostgreSqlNetCore.Infra.Data.Context; namespace PostgreSqlNetCore.Prompt { public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<PostgreSqlContext> { public PostgreSqlContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var builder = new DbContextOptionsBuilder<PostgreSqlContext>(); var connectionString = configuration.GetConnectionString("PostgreSqlNetCoreConnection"); builder.UseNpgsql(connectionString); return new PostgreSqlContext(builder.Options); } } } |
Agora é preciso associar todos os projetos na solução, e para isso, abra a pasta raiz no terminal, e execute os comando a seguir:
1 2 3 |
dotnet sln add .\src\PostgreSqlNetCore.Domain\ dotnet sln add .\src\PostgreSqlNetCore.Infra.Data\ dotnet sln add .\src\PostgreSqlNetCore.Prompt\ |
Agora é só executar o comando para criar a migração.
1 |
dotnet ef migrations add initial --project .\src\PostgreSqlNetCore.Infra.Data\PostgreSqlNetCore.Infra.Data.csproj --startup-project .\src\PostgreSqlNetCore.Prompt\ |
E então atualizar o banco de dados.
1 |
dotnet ef database update --project .\src\PostgreSqlNetCore.Infra.Data\ --startup-project .\src\PostgreSqlNetCore.Prompt\ |
E enfim podemos ver o banco de dados com as nossas tabelas criadas e o versionamento das migrations.
Acesse o repositório no githus deste projeto no link a seguir:
https://github.com/tiagopariz/PostgreSqlNetCore
Obrigado, e até a próxima.