我有一个基类 Entity,它有一个字符串 Id 成员和一个派生类 A。
但是,当创建派生类的新实例并使用 InsertOneAsync 将其添加到我的集合中时,该文档将添加到数据库中,并使用 null 作为 Id 值。
使用 ObjectId 作为 Id 似乎确实有效,但我试图防止模型中对 MongoDB 的依赖。
我也尝试了以下代码,但结果是一样的:
BsonClassMap.RegisterClassMap<Entity>(cm =>
{
cm.MapIdField(x => x.Id).SetSerializer(new StringSerializer(BsonType.ObjectId));
});
我遇到了同样的问题,最终让它与以下属性一起工作(使用 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 仍然为空
您是否尝试不在模型中使用 ObjectID? ID 不必是 objectID。您可以将字符串字段装饰为 ID。
我已将字符串属性与
[BsonId]
属性一起使用,没有任何问题。
在这篇文章发表后的 9 年内,我遇到了同样的问题。
我的错误是使用
?
将 ID 属性声明为可为空。
我的财产看起来像这样:
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
[BsonIgnoreIfDefault]
public ObjectId? _Id { get; set; }
删除 id 属性的问号以消除可为空性后,该属性在插入后按预期设置。