Как управлять полем _id при использовании POCO с помощью драйвера mongodb С#
Если я хочу читать и записывать данные манго с помощью POCO
public class Thingy
{
public string Foo {get;set;}
}
...
coll.Insert(new Thing(Foo = "hello"));
Когда я читаю назад, я получаю отказ, говоря, что _id - неожиданный атрибут (который он есть). Итак, я добавил в класс поле под названием _id. Теперь вставка не работает, говоря, что поле _id не может быть нулевым. Попробованный атрибут BsonIgnoreIfNull, который не работал.
Ответы
Ответ 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);