Короче говоря: все о конвенциях.Драйвер 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
, который
Указывает, что IdMember класса должен быть нулевым.
[BsonNoId]
public class SubServiceDef
{
[BsonElement("id")]
public int Id { get; set; }
}
Таким образом, соглашение будет устанавливать ваш id
как IdMember на карте классов, но затем во время постобработки этот атрибут заставит IdMember быть нулевым, и ваш класс будет успешно десериализован