簡體   English   中英

使用StringObjectIdGenerator時,MongoDB C#不會為_id / ObjectId生成值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM