как управлять полем _id при использовании POCO с драйвером mongodb c # - PullRequest
27 голосов
/ 19 мая 2011

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

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

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

Ответы [ 5 ]

57 голосов
/ 20 мая 2011

Когда вы вставляете объект, если у него нет поля _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, вы можете установить для него любое значение любого типа данных (кроме массива), оно просто должно быть уникальным в коллекции.

9 голосов
/ 11 июня 2011

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

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

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

2 голосов
/ 21 марта 2016

Я обычно заворачиваю Thingy:

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

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

1 голос
/ 19 мая 2011

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

public BsonObjectId Id { get; set; }

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

0 голосов
/ 26 декабря 2014
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);
...