EF провайдеры баз данных - PostgreSQL

  • Михаил
  • 12 мин. на прочтение
  • 121
  • 15 Nov 2022
  • 15 Nov 2022

Для работы с базой данных PostgreSQL создадим новый консольный проект .NET Core. Для работы с этой СУБД вместо с Entity Framework Core в проект необходимо добавить через Nuget пакет Npgsql.EntityFrameworkCore.PostgreSQL:

После установки пакета определим в проекте класс User:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

И также определим класс контекста данных:

using Microsoft.EntityFrameworkCore;
namespace HelloApp
{
    public class ApplicationContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public ApplicationContext()
        {
            Database.EnsureCreated();
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseNpgsql("Host=localhost;Port=5433;Database=usersdb;Username=postgres;Password=здесь_указывается_пароль_от_postgres");
        }
    }
}

Для установки подключения к базе данных в методе OnConfiguring вызывается метод UseNpgsql(), в который передается строка подключения. Строка подключения содержит адрес сервера (параметр Host), порт (Port), название базы данных на сервере (Database), имя пользователя в рамках сервера PostgreSQL (Username) и его пароль (Password). В зависимости от настроек сервера PostgreSQL параметры могут отличаться.

Теперь определим в файле Program.cs простейшую программу по добавлению и извлечению объектов из базы данных:

using System;
using System.Linq;
namespace HelloApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // добавление данных
            using (ApplicationContext db = new ApplicationContext())
            {
                // создаем два объекта User
                User user1 = new User { Name = "Tom", Age = 33 };
                User user2 = new User { Name = "Alice", Age = 26 };
                // добавляем их в бд
                db.Users.AddRange(user1, user2);
                db.SaveChanges();
            }
            // получение данных
            using (ApplicationContext db = new ApplicationContext())
            {
                // получаем объекты из бд и выводим на консоль
                var users = db.Users.ToList();
                Console.WriteLine("Users list:");
                foreach (User u in users)
                {
                    Console.WriteLine($"{u.Id}.{u.Name} - {u.Age}");
                }
            }
        }
    }
}

Консольный вывод:

Users list: 1.Tom - 33 2.Alice - 26

Миграции

Выше для создания базы данных использовался метод Database.EnsureCreated. Теперь изменим класс контекста данных - уберем вызов Database.EnsureCreated и изменим название база данных:

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("Host=localhost;Port=5433;Database=usersdb2;Username=postgres;Password=password");
    }
}

Посмотрим теперь, как использовать миграции. Прежде всего нам надо добавить в проект через Nuget пакет Microsoft.EntityFrameworkCore.Tools для поддержки миграций.

Для создания базы данных создадим и выполним миграции. Для этого в окне Package Manager Console введем команду:

Add-Migration Initial

После генерации файла миграции для создания базы данных выполним команду:

Update-Database

После этого на сервере будет создана база данных, и мы сможем с ней взаимодействовать.

Подключение к существующей базе данных

Для подключения к существующей базе данных в PostgreSQL необходимо в Package Manager Console выполнить команду Scaffold-DbContext, которой передается строка подключения и название провайдера, то есть Npgsql.EntityFrameworkCore.PostgreSQL (для выполнения этой команды тоже необходим пакет Microsoft.EntityFrameworkCore.Tools). Сначала вводится команда Scaffold-DbContext и строка подключения:

Scaffold-DbContext "Host=localhost;Port=5432;Database=usersdb;Username=postgres;Password=password"

Затем в консоли появится слово Provider, после которого надо будет ввести название провайдера, то есть

Npgsql.EntityFrameworkCore.PostgreSQL

Причем на данный момент название провайдера вводится вручную.

И если все прошло удачно, то EntityFramework Core автоматически сгенерирует все необходимые классы моделей и контекста.