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

Как управлять полем _id при использовании POCO с помощью драйвера mongodb С#

Если я хочу читать и записывать данные манго с помощью POCO

public class Thingy
{
     public string Foo {get;set;}
}
...
coll.Insert(new Thing(Foo = "hello"));

Когда я читаю назад, я получаю отказ, говоря, что _id - неожиданный атрибут (который он есть). Итак, я добавил в класс поле под названием _id. Теперь вставка не работает, говоря, что поле _id не может быть нулевым. Попробованный атрибут BsonIgnoreIfNull, который не работал.

4b9b3361

Ответ 1

Когда вы вставляете объект, если у него нет поля _id, тогда драйвер добавляет его и устанавливает его в 12-байтовый MongoDB ObjectId значение.

Вам просто нужно добавить свойство Id в свой POCO, который будет десериализован от _id:

public class Thingy
{
     public ObjectId Id { get; set; }
}

Или, если вы хотите делегировать другое свойство для отображения на _id, тогда вы можете украсить его с помощью BsonIdAttribute, например:

[BsonId]
public ObjectId MyKey { get; set; }   

Поле _id не обязательно должно быть MongoDB ObjectId, вы можете установить его на любое значение любого типа данных (кроме массива), оно просто должно быть уникальным в коллекции.

Ответ 2

Вам нужно добавить свойство (или поле) для id и указать serializer, какой генератор идентификаторов вы хотели бы использовать.

[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public object ThingyId { get; set; }

Есть 3 доступных в MongoDb Driver, или вы можете написать свой собственный. Дополнительная информация на http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator

Ответ 3

Обычно обертываю Thingy:

public class MongoThingy
{
    public ObjectId Id { get; set; }
    public Thingy Thingy { get; set; }
}

Это делает его намного проще, так как часто раз класс Thingy происходит из другой библиотеки, над которой я не контролирую. Это также легче десериализовать, чтобы передать его кому-то другому для обработки.

Ответ 4

Добавьте свойство следующим образом:

public BsonObjectId Id { get; set; }

Драйвер MongoDB автоматически преобразует Id в _id во время сериализации\deserializtion.

Ответ 5

public class Thingy
{
      public ObjectId Id { get; set; }
      public string Foo { get; set; }
}

Согласно классу

При необходимости используйте следующий код:

var collection = database.GetCollection<Thingy>("db_Thingy");
Thingy tg= new Thingy();
tg.Foo = "Hello";
collection.insert(tg);