Marten في C# (.NET): دليل شامل لـ Document DB و Event Store على PostgreSQL
Marten هي مكتبة قوية لمنصة .NET، تحوّل PostgreSQL إلى مخزن بيانات هجين يجمع بين إمكانيات قواعد البيانات الوثائقية (Document Database) ومخازن الأحداث (Event Store). طورتها فريق JasperFx، وتتيح للمطورين التعامل مع PostgreSQL كنظام يشبه NoSQL مع الاحتفاظ بجميع مزايا قواعد البيانات العلائقية.
لماذا تحتاج Marten؟ في التطوير الحديث، غالبًا ما تحتاج إلى مرونة قواعد البيانات الوثائقية (مثل MongoDB) لتخزين البيانات المعقدة وشبه المنظمة، وفي نفس الوقت تحتاج إلى موثوقية ودعم المعاملات (Transactions) في قواعد البيانات العلائقية. تحل Marten هذه المشكلة من خلال توفير مزود LINQ للتعامل مع مستندات JSON المخزنة في PostgreSQL، بالإضافة إلى مخزن أحداث متكامل لتطبيق أنماط Event Sourcing و CQRS. هذا مفيد بشكل خاص في بنية الخدمات المصغرة (Microservices)، وأنظمة التدقيق، والتطبيقات المالية، وأي مشروع يتطلب مزيجًا من مرونة المخطط (Schema) واتساق البيانات.
المكتبة مدعومة بنشاط وتُستخدم في مشاريع إنتاجية. تتكامل مع ASP.NET Core و Entity Framework Core (عند الحاجة)، وتوفر واجهة برمجة تطبيقات (API) غنية للتعامل مع البيانات. تقوم Marten تلقائيًا بإنشاء وتحديث مخطط قاعدة البيانات، وتدعم الترحيل (Migrations)، والفهارس (Indexes)، وحتى البحث النصي الكامل (Full-Text Search). هذا يجعلها خيارًا ممتازًا لمطوري .NET الذين يرغبون في استخدام قوة PostgreSQL دون كتابة استعلامات SQL معقدة.
التثبيت
يتم تثبيت Marten عبر NuGet Package Manager. نفّذ أحد الأوامر التالية:
dotnet add package Marten
أو عبر Package Manager Console:
Install-Package Marten
للعمل مع Event Store، لا تحتاج إلى حزم إضافية — كل شيء مضمن في الحزمة الرئيسية. يُوصى أيضًا بتثبيت Marten.AspNetCore للتكامل مع ASP.NET Core:
dotnet add package Marten.AspNetCore
البدء السريع
مثال عملي بسيط يشمل إعداد الاتصال بـ PostgreSQL، تعريف مستند (Document)، وتنفيذ عمليات CRUD.
using Marten;
using System;
using System.Threading.Tasks;
// 1. تعريف المستند
public class User
{
public Guid Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
// 2. إعداد DocumentStore
var store = DocumentStore.For(options =>
{
options.Connection("Host=localhost;Database=marten_db;Username=postgres;Password=password");
options.AutoCreateSchemaObjects = AutoCreate.All; // إنشاء الجداول تلقائيًا
});
// 3. فتح جلسة عمل
using var session = store.LightweightSession();
// 4. إنشاء مستند جديد
var user = new User
{
Id = Guid.NewGuid(),
Name = "أحمد علي",
Age = 30,
Email = "ahmed@example.com"
};
session.Store(user);
await session.SaveChangesAsync();
// 5. تحميل المستند بواسطة المعرف (ID)
var loadedUser = await session.LoadAsync<User>(user.Id);
Console.WriteLine($"تم تحميل المستخدم: {loadedUser.Name}, العمر: {loadedUser.Age}");
// 6. تحديث المستند
loadedUser.Age = 31;
session.Store(loadedUser);
await session.SaveChangesAsync();
// 7. حذف المستند
session.Delete(loadedUser);
await session.SaveChangesAsync();
Console.WriteLine("تم بنجاح!");
}
}
يوضح هذا المثال العمليات الأساسية: إنشاء، قراءة، تحديث، وحذف مستند. Ma