Подтвердить что ты не робот

MongoDB.NET не генерирует _id на upsert

Я пытаюсь взломать документ в MongoDB 2.4.4 с помощью драйвера .NET. Кажется, что он автоматически не генерирует _id на upserts, хотя он корректно генерирует _id для простых вставок. Как заставить драйвер правильно генерировать _id?

Вот небольшой пример, демонстрирующий проблему.

public class MongoObject
{
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    [BsonRepresentation(BsonType.ObjectId)]
    public string MongoID { get; set; }

    public int Index { get; set; }
}

var obj = new MongoObject()
{
    Index = 1
};

//This inserts the document, but with a _id set to Null
_collection.Update(Query.EQ("Index", BsonValue.Create(1)), Update.Replace(obj), UpdateFlags.Upsert, new WriteConcern() { Journal = true });

//This inserts the document with the expected autogenerated _id
//_collection.Insert(obj);
4b9b3361

Ответ 1

И, конечно, я нахожу ответ сразу после публикации вопроса. Из этого ответа решение заключается в добавлении к идентификатору атрибута [BsonIgnoreIfDefault]. В примере из вопроса это будет:

public class MongoObject
{
    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    [BsonRepresentation(BsonType.ObjectId)]
    [BsonIgnoreIfDefault]    // <--- this is what was missing
    public string MongoID { get; set; }

    public int Index { get; set; }
}