Сохранить имя свойства Id во встроенном документе с помощью драйвера C # mongo - PullRequest
9 голосов
/ 29 июня 2011

У меня есть документ на монго, который содержит массив встроенных документов. Вложенные документы имеют свойство с именем «Id».

{ Name: "Outer object", Embedded: [ {Name: "Embedded A", Id: "5f1c591a71dc237199eeaeda"} ] }

Мои объекты отображения C # выглядят примерно так (очевидно, это упрощение)

public class Outer
{
    public string Name { get; set; }
    public IEnumerable<Inner> Inners { get; set; }
}

public class Inner
{
    public string Name { get; set; }
    public string Id { get; set; }
}

Когда я записываю внешнее в базу данных, драйвер C # меняет имя свойства Inner.Id на _id. Как мне обойти это автоматическое переименование? Я пытался использовать атрибут [BsonElement ("Id")] в свойстве Id, но это не помогло.

Ответы [ 3 ]

14 голосов
/ 29 июня 2011

Документация MongoDB явно заявляет :

Для документов в MongoDB требуется ключ _id, который однозначно их идентифицирует.

С другой стороны, свойства C # обычно являются паскалями и не используют префиксы, поэтому разработчики драйверов явно решили принудительно сопоставить Id свойство _idАтрибут базы данных .

Если вы хотите связать атрибут, отличный от _id, который просто называется и вызывается Id в MongoDB , вы можете объявить другое свойство C # с помощьюимя, отличное от Id, чтобы драйвер не мешал ему:

public class Inner
{
    public string Name { get; set; }

    [BsonElement("Id")]
    public string IdStr { get; set; }
}
3 голосов
/ 11 августа 2017

Я согласен с ответом Дэна, но в некоторых случаях, если вам не разрешено изменять свойство "Id" на что-то другое, вы можете явно изменить поведение в картах классов, как показано ниже.

            BsonClassMap.RegisterClassMap<Inner>(cm =>
            {
                cm.AutoMap();
                cm.UnmapProperty(c => c.Id);
                cm.MapMember(c => c.Id)
                    .SetElementName()
                    .SetOrder(0) //specific to your needs
                    .SetIsRequired(true); // again specific to your needs
            });
1 голос
/ 07 июня 2016

Я не могу комментировать, поэтому напишу новый ответ. Мои заметки сэкономят много времени для людей. Если ваш _id в mongodb имеет тип ObjectID, то в C # вам нужно добавить еще несколько атрибутов:

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
[BsonElement("Id")]
public string Subject { get; set; }
...