Marten C# (.NET) 完整指南:Document DB 与 Event Store 实战教程

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Marten C# (.NET) 完整指南:在 PostgreSQL 上实现 Document DB 与 Event Store

Marten 是一个强大的 .NET 库,能将 PostgreSQL 转变为混合数据存储,融合文档数据库(Document Database)和事件存储(Event Store)的双重能力。由 JasperFx 团队开发,它让开发者能够像使用 NoSQL 系统一样操作 PostgreSQL,同时保留关系型数据库的所有优势。

为什么需要 Marten?现代开发中,我们经常需要文档数据库(如 MongoDB)的灵活性来存储复杂、半结构化数据,同时又需要关系型数据库的可靠性和事务支持。Marten 完美解决了这一矛盾:它提供 LINQ 查询支持,用于操作存储在 PostgreSQL 中的 JSON 文档,并内置完整的事件存储,方便实现事件溯源(Event Sourcing)和 CQRS 模式。这在微服务架构、审计系统、金融应用以及任何需要灵活数据模式与强一致性结合的项目中尤其有用。

该库得到积极维护,并已在生产环境中广泛使用。它能与 ASP.NET Core 无缝集成,必要时也可与 Entity Framework Core 配合使用,并提供丰富的数据操作 API。Marten 能自动创建和更新数据库架构,支持迁移、索引甚至全文搜索。对于希望利用 PostgreSQL 强大功能而又不想编写复杂 SQL 的 .NET 开发者来说,这是一个绝佳选择。

安装

通过 NuGet 包管理器安装 Marten。执行以下任一命令:

dotnet add package Marten

或通过包管理器控制台:

Install-Package Marten

使用事件存储无需额外安装包——所有功能已包含在主包中。建议同时安装 Marten.AspNetCore 以便与 ASP.NET Core 集成:

dotnet add package Marten.AspNetCore

快速入门

以下最小工作示例包括配置 PostgreSQL 连接、定义文档以及执行 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 = "zhangsan@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("操作完成!");
    }
}

此示例演示了基本操作:创建、读取、更新和删除文档。

推荐