使用StringObjectIdGenerator时,MongoDB C#不会为_id / ObjectId生成值

时间:2016-05-31 17:48:05

标签: c# mongodb

我正在尝试关注示例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?

1 个答案:

答案 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”中看到的值填充。