我正在尝试关注示例here,但有些事情无法正常工作。我已经实现了以下内容:
我的模特
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()操作时,MyModelId的BsonDocument中都没有元素。此外,BsonDocument中的_id元素始终设置为“BsonNull”。然后,如果我再次尝试插入,MongoDB会抛出“E11000重复键错误集合:”错误,大概是因为已存在值为“BsonNull”的错误。
如果我注释掉我的映射,会为_id创建一个ObjectId值,但是我无法反序列化回MyModel。
为什么StringObjectIdGenerator实际上没有生成ID?
答案 0 :(得分:0)
好吧,在观察This post后进行了一些有根据的猜测,我尝试了以下内容:
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”中看到的值填充。