![](/img/trans.png)
[英]C# + MongoDB - ObjectId without using MongoDB DataTypes/Attributes
[英]MongoDB C# does not generate a value for _id/ObjectId when using StringObjectIdGenerator
我正在嘗試按照此處的示例進行操作,但是某些方法無法正常工作。 我已經實現了以下情況:
我的模特
public class MyModel {
public string MyModelId { get; set; }
//Other properties
}
我的地圖
BsonClassMap.RegisterClassMap<MyModel>(cm =>
{
cm.AutoMap();
cm.MapIdProperty(c => c.MyModelId)
.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetSerializer(new StringSerializer(BsonType.ObjectId));
});
我的插入
if (!BsonClassMap.IsClassMapRegistered(typeof(MyModel)))
{
//Do the mapping above
}
var collection = RetrieveCollection("MyModels"); //method used to retrieve an IMongoCollection from the database.
var bsonDoc = model.ToBsonDocument(); //model is an argument passed in to the method of type MyModel
collection.InsertOne(bsonDoc);
每次完成InsertOne()操作后,BsonDocument中就沒有MyModelId元素。 此外,BsonDocument中有一個用於_id的元素,該元素始終設置為“ BsonNull”。 然后,如果我嘗試再次插入,MongoDB會引發“ E11000重復鍵錯誤集合:”錯誤,大概是因為已經存在一個值“ BsonNull”。
如果我注釋掉了映射,則會為_id創建一個ObjectId值,但隨后我將無法反序列化回MyModel。
為什么不StringObjectIdGenerator實際生成的ID?
好吧,鑒於查看此帖子后的一些有根據的猜測,我嘗試了以下操作:
BsonClassMap.RegisterClassMap<MyModel>(cm =>
{
cm.AutoMap();
cm.MapIdProperty(c => c.MyModelId)
.SetIgnoreIfDefault(true) //added this line
.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetSerializer(new StringSerializer(BsonType.ObjectId));
});
這似乎已經解決了問題。 插入BsonDocument時,我仍然看到“ _id”字段,而不是“ MyModelId”。 但是,“ _ id”字段中有一個值。 此外,當我從集合中檢索值並將其反序列化為MyModel對象時,MyModelId屬性由先前在“ _id”中看到的值填充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.