example - cómo administrar el campo_id cuando se usa POCO con el controlador mongodb c#
mongodb driver c# sample (5)
Agregue una propiedad de la siguiente manera:
public BsonObjectId Id { get; set; }
El controlador MongoDB convierte automáticamente el Id
a _id
durante la serialización / deserialización.
Si quiero leer y escribir datos mongo con un POCO
public class Thingy
{
public string Foo {get;set;}
}
...
coll.Insert(new Thing(Foo = "hello"));
Cuando leo de nuevo, se produce un error que dice que _id es un atributo inesperado (que es) Entonces agregué un campo llamado _id a la clase. Ahora la inserción no funciona diciendo que el campo _id no puede ser nulo. Un atributo BsonIgnoreIfNull probado, que no funcionó.
Cuando inserta un objeto, si no tiene un campo _id
, el controlador agrega uno y lo establece en un valor de _id
objeto de 12 bytes MongoDB.
Solo necesita agregar una propiedad de Id
a su POCO, que se deserializará desde _id
:
public class Thingy
{
public ObjectId Id { get; set; }
}
O, si desea delegar otra propiedad para _id
a _id
entonces puede decorarla con el BsonIdAttribute
, como este:
[BsonId]
public ObjectId MyKey { get; set; }
El campo _id
no tiene que ser un ObjectId
MongoDB, puede configurarlo a cualquier valor de cualquier tipo de datos (excepto una matriz), solo debe ser único dentro de la colección.
Debe agregar una propiedad (o campo) para id y decirle al serializador qué generador de id le gustaría usar.
[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public object ThingyId { get; set; }
Hay 3 disponibles en MongoDb Driver o puedes escribir el tuyo propio. Más información en http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator
Generalmente envuelvo a Thingy:
public class MongoThingy
{
public ObjectId Id { get; set; }
public Thingy Thingy { get; set; }
}
Lo hace mucho más fácil, ya que muchas veces la clase Thingy proviene de una biblioteca diferente sobre la que no tengo control. También es más fácil deserializar para entregarlo a otra persona para su procesamiento.
public class Thingy
{
public ObjectId Id { get; set; }
public string Foo { get; set; }
}
Segun la clase
Donde sea necesario, use el siguiente código:
var collection = database.GetCollection<Thingy>("db_Thingy");
Thingy tg= new Thingy();
tg.Foo = "Hello";
collection.insert(tg);