在使用BsonClassMap时,如何获取MongoDB中插入文档的_id?

4
在将此问题标记为 Get _id of an inserted document in MongoDB? 的重复问题之前,请阅读整个问题。
我正在使用MongoDB driver开发一个ASP.NET Core API应用程序。
我面临的问题是,在将文档插入数据库后,Post类的Id属性未被分配为MongoDB生成的ID。
我找到了一些问题,他们使用类中的注释/属性来解决它,但我正在开发一个领域类没有任何持久性知识的模式。
我创建了一个没有注释的实体类:
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属性为null。

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

1个回答

3

目前,您的代码已经可以从数据库中以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);
    });

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

谢谢,我在设置生成器后得到了ID。但是,我曾经看到它是在没有设置生成器的情况下完成的。尽管如此,我无法弄清楚他们是如何做到的。 - Kishan Vaishnav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接