Работа с базами данных в C#: PostgreSQL и MongoDB — полное руководство для .NET-разработчика
Современная разработка на C# (.NET) редко обходится без взаимодействия с базами данных. Независимо от того, создаёте ли вы веб-приложение, микросервис или десктопный инструмент, умение подключаться и управлять данными — ключевой навык. В этой статье мы разберём работу с двумя популярными системами управления базами данных: реляционной PostgreSQL и документо-ориентированной MongoDB. Вы узнаете, как настроить подключение, выполнять CRUD-операции и избегать типичных ошибок.
1. Подключение к PostgreSQL из C# (.NET) с использованием Npgsql
PostgreSQL — мощная реляционная СУБД с открытым исходным кодом. Для работы с ней в .NET используется провайдер Npgsql. Установите его через NuGet:
dotnet add package Npgsql
После установки создаётся подключение через строку соединения. Пример:
using Npgsql;
string connectionString = "Host=localhost;Port=5432;Database=mydb;Username=user;Password=pass";
using var conn = new NpgsqlConnection(connectionString);
conn.Open();
Console.WriteLine("Подключение к PostgreSQL установлено!");
Выполнение SQL-запросов: CREATE, INSERT, SELECT
Для выполнения команд используйте NpgsqlCommand. Рассмотрим создание таблицы и вставку данных:
using var cmd = new NpgsqlCommand();
cmd.Connection = conn;
// Создание таблицы
cmd.CommandText = @"
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(200) UNIQUE
)";
cmd.ExecuteNonQuery();
// Вставка данных с параметрами
cmd.CommandText = "INSERT INTO users (name, email) VALUES (@name, @email)";
cmd.Parameters.AddWithValue("name", "Иван Петров");
cmd.Parameters.AddWithValue("email", "ivan@example.com");
cmd.ExecuteNonQuery();
// Чтение данных
cmd.CommandText = "SELECT id, name, email FROM users";
using var reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine($"{reader["id"]}: {reader["name"]} - {reader["email"]}");
}
Важно: всегда используйте параметризованные запросы для защиты от SQL-инъекций.
2. Работа с PostgreSQL через Entity Framework Core
Для более высокоуровневой работы рекомендуется Entity Framework Core (EF Core) с провайдером Npgsql. Установите пакеты:
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
Создайте контекст и модель:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseNpgsql("Host=localhost;Database=mydb;Username=user;Password=pass");
}
// Использование
using var db = new AppDbContext();
db.Database.EnsureCreated();
var user = new User { Name = "Анна Смирнова", Email = "anna@example.com" };
db.Users.Add(user);
db.SaveChanges();
var users = db.Users.ToList();
EF Core автоматически генерирует SQL, управляет миграциями и упрощает сопровождение кода.
3. Подключение к MongoDB из C# (.NET) с помощью MongoDB.Driver
MongoDB — NoSQL база данных, хранящая данные в формате BSON-документов. Для C# используйте официальный драйвер MongoDB.Driver:
dotnet add package MongoDB.Driver
Подключение к локальному серверу:
using MongoDB.Driver;
using MongoDB.Bson;
var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("mydb");
var collection = database.GetCollection<BsonDocument>("users");
Console.WriteLine("Подключение к MongoDB установлено!");
CRUD-операции с документами
Вставка и чтение данных:
// Вставка документа
var document = new BsonDocument
{
{ "name", "Петр Иванов" },
{ "email", "petr@example.com" },
{ "age", 30 }
};
collection.InsertOne(document);
// Чтение всех документов
var filter = Builders<BsonDocument>.Filter.Empty;
var documents = collection.Find(filter).ToList();
foreach (var doc in documents)
{
Console.WriteLine(doc.ToJson());
}
// Обновление
var updateFilter = Builders<BsonDocument>.Filter.Eq("name", "Петр Иванов");
var update = Builders<BsonDocument>.Update.Set("age", 31);
collection.UpdateOne(updateFilter, update);
// Удаление
collection.DeleteOne(updateFilter);
Работа с типизированными классами
Для удобства используйте POCO-классы. Добавьте атрибут BsonId для идентификатора:
public class User
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
var collectionTyped = database.GetCollection<User>("users");
var newUser = new User { Name = "Ольга", Email = "olga@example.com", Age = 25 };
collectionTyped.InsertOne(newUser);
var allUsers = collectionTyped.Find(u => true).ToList();
4. PostgreSQL vs MongoDB: когда что выбирать?
Выбор между реляционной и NoSQL базой зависит от задачи:
- PostgreSQL — идеальна для структурированных данных с чёткими связями (финансовые системы, CRM, ERP). Поддерживает сложные JOIN, транзакции ACID, хранимые процедуры.
- MongoDB — подходит для гибких схем, быстрого прототипирования, хранения JSON-подобных документов (логи, каталоги товаров, социальные сети). Легко масштабируется горизонтально.
В .NET-экосистеме обе базы имеют отличную поддержку. Для PostgreSQL используйте Npgsql или EF Core; для MongoDB — MongoDB.Driver с LINQ-подобным синтаксисом.
Заключение
Мы рассмотрели практические аспекты работы с базами данных в C# (.NET). Вы научились подключаться к PostgreSQL через Npgsql и Entity Framework Core, а также к MongoDB через официальный драйвер. Оба подхода имеют свои сильные стороны: реляционные модели дают строгую целостность данных, а документо-ориентированные — гиб