2011-05-19 13 views
24

Si quiero leer y escribir datos mongo con un POCOcómo gestionar campo _id al utilizar POCO con mongodb C# conductor

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

Cuando leí de arriba me sale un error diciendo que _id es un atributo inesperado (cual 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ó.

Respuesta

50

Cuando inserta un objeto, si no tiene un campo _id, el controlador agrega uno y lo establece en un valor de 12 bytes MongoDB ObjectId.

Sólo tiene que añadir una propiedad a su Id POCO, que será deserialised de _id:

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

O, si desea delegar otra propiedad debe correlacionarse con _id continuación, se puede decorar con el BsonIdAttribute, así:

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

_id el campo no tiene que ser un MongoDB ObjectId, se puede establecer en cualquier valor de cualquier tipo de datos (excepto una matriz), solo necesita ser único dentro de la colección.

+3

+1 para la explicación final de que el _id se puede establecer en cualquier valor de cualquier tipo de datos (excepto la matriz). Estaba un poco confundido por la documentación oficial sobre este punto – s0nica

+0

[expitive] [explitive] [explitive], estado luchando con esto durante 2 días. gracias @Chris Fulstow, ¡una característica tan oscura pero clave! –

0

añadir un alojamiento de la siguiente manera:

public BsonObjectId Id { get; set; } 

El conductor MongoDB convierte automáticamente Id-_id durante la serialización \ deserializtion.

+0

thx - Tengo la sensación de que hay un conjunto de documentos, muestras o algo que me falta :-) – pm100

+1

@Bryan Migliorisi - esto no funciona. La inserción (o Guardar) falla al decirme que Id no puede ser nulo – pm100

+0

¿Qué controlador está usando? –

9

Debe agregar una propiedad (o campo) para la identificación y decirle al serializador qué generador de identificación desea usar.

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

Hay 3 disponibles en MongoDb Driver o puede escribir el suyo. Más información en http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator

+0

Ese enlace parece estar roto ahora. – UpTheCreek

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

De acuerdo con la clase

Cuando sea necesario, utilice el siguiente código:

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

lo general envuelvo Thingy:

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

Esto hace que sea mucho más fácil, como 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.

Cuestiones relacionadas