使用 BsonClassMap 时获取 MongoDB 中插入文档的 _id?

Get _id of an inserted document in MongoDB when using BsonClassMap?

在任何人将此问题标记为 Get _id of an inserted document in MongoDB? 的重复之前,请阅读整个问题。

我正在开发带有 MongoDB 驱动程序的 ASP.NET 核心 API 应用程序。

我面临的问题是,在数据库中插入文档后,Post class 的 Id 属性 未分配MongoDB.

生成的id

我发现他们使用 class 中的 annotations/attributes 解决了一些问题,但是,我正在开发一种模式,其中域 classes 没有任何持久性知识。

我创建了没有注释的实体 class:

public class Post
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
}

并使用 BsonClassMap 定义映射:

BsonClassMap.RegisterClassMap<Domain.Entities.Post>(x =>
        {
            x.AutoMap();
            x.MapIdField(x => x.Id)
                .SetSerializer(new StringSerializer(BsonType.ObjectId))
                .SetIgnoreIfDefault(true);
        });

代码如下:

public async Task Create(Domain.Entities.Post entity, CancellationToken cancellationToken)
    {
        async Task Create()
        {
            await Post.InsertOneAsync(entity);
        }
        await Create();
        var e = entity;
    }

当我检查实体时,Id 属性 为空。

那么,在使用 BsonClassMap 时如何获取 ID?

目前,您的代码知道如何读取来自数据库的 ObjectId ID,但在客户端生成 ID 时仍需要帮助,

缺少的部分是SetIdGenerator方法调用,试试:

BsonClassMap.RegisterClassMap<Post>(x =>
    {
        x.AutoMap();
        x.MapIdField(x => x.Id)
            .SetIdGenerator(StringObjectIdGenerator.Instance)
            .SetSerializer(new StringSerializer(BsonType.ObjectId))
            .SetIgnoreIfDefault(true);
    });

现在将在客户端生成 ObjectId 并将其转换为字符串,因此当您将鼠标悬停在 e 变量上时应该能够看到它们。

详情here.