Накратко:всичко е въпрос на конвенции. Драйверът MongoDB .NET разкрива статичен клас ConventionRegistry
което ви позволява да регистрирате свои собствени конвенции (още тук
). Освен това има две "вградени" конвенции __defaults__
и __attributes__
. Копаем по-дълбоко (драйвер github
) можете да откриете, че регистрира една доста интересна конвенция:
new NamedIdMemberConvention(new [] { "Id", "id", "_id" })
Което означава, че id
членовете ще се считат за обикновени BSON _id елементи.
Как да поправя това?
Можете да се отървете от стандартните конвенции
ConventionRegistry.Remove("__defaults__");
Въпреки това автоматично ще премахнете всички други конвенции на драйверите, което е доста рисковано. Като алтернатива можете да създадете фалшиво свойство, което винаги ще бъде празно:
public class SubServiceDef
{
[BsonElement("id")]
public int Id { get; set; }
[BsonId]
public ObjectId FakeId { get; set; }
}
или можете просто да използвате BsonNoId
атрибут which
[BsonNoId]
public class SubServiceDef
{
[BsonElement("id")]
public int Id { get; set; }
}
Така че конвенцията ще задава вашия id
като IdMember в картата на класа, но след това по време на последваща обработка този атрибут ще принуди IdMember да бъде null и вашият клас ще бъде десериализиран успешно