InsertOneAsync 后 MongoDB id 保持为空

问题描述 投票:0回答:3

我有一个基类 Entity,它有一个字符串 Id 成员和一个派生类 A。

但是,当创建派生类的新实例并使用 InsertOneAsync 将其添加到我的集合中时,该文档将添加到数据库中,并使用 null 作为 Id 值。

使用 ObjectId 作为 Id 似乎确实有效,但我试图防止模型中对 MongoDB 的依赖。

我也尝试了以下代码,但结果是一样的:

BsonClassMap.RegisterClassMap<Entity>(cm =>
{
    cm.MapIdField(x => x.Id).SetSerializer(new StringSerializer(BsonType.ObjectId));
});
mongodb mongodb-.net-driver
3个回答
17
投票

我遇到了同样的问题,最终让它与以下属性一起工作(使用 2.0 驱动程序):

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
[BsonIgnoreIfDefault]

或者等效的 BsonClassMap 流畅接口:

BsonClassMap.RegisterClassMap<Entity>(cm =>
{
      cm.MapIdField(x => x.Id)
      .SetSerializer(new StringSerializer(BsonType.ObjectId))
      .SetIgnoreIfDefault(true);
});

我尝试在 Upsert 打开的情况下使用 .ReplaceOneAsync 进行相同的工作,但这总是使 id 仍然为空


0
投票

您是否尝试不在模型中使用 ObjectID? ID 不必是 objectID。您可以将字符串字段装饰为 ID。

我已将字符串属性与

[BsonId]
属性一起使用,没有任何问题。


0
投票

在这篇文章发表后的 9 年内,我遇到了同样的问题。

我的错误是使用

?
将 ID 属性声明为可为空。

我的财产看起来像这样:

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
[BsonIgnoreIfDefault]
public ObjectId? _Id { get; set; }

删除 id 属性的问号以消除可为空性后,该属性在插入后按预期设置。

© www.soinside.com 2019 - 2024. All rights reserved.