web-dev-qa-db-fra.com

comment gérer le champ _id lors de l'utilisation de POCO avec le pilote mongodb c #

Si je veux lire et écrire des données Mongo avec un POCO

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

Lorsque je relis, un échec me dit que _id est un attribut inattendu (ce qui est le cas). Alors j'ai ajouté un champ appelé _id à la classe. Maintenant, l'insertion ne fonctionne pas en disant que le champ _id ne peut pas être nul. Un attribut BsonIgnoreIfNull essayé, qui n'a pas fonctionné.

26
pm100

Lorsque vous insérez un objet, s'il ne contient pas de champ _id, le pilote en ajoute un et le définit sur une valeur MongoDB ObjectId 12 octets.

Vous devez simplement ajouter une propriété Id à votre POCO, qui sera désérialisée à partir de _id:

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

Ou, si vous souhaitez déléguer une autre propriété à mapper sur _id, vous pouvez la décorer avec la variable BsonIdAttribute, comme ceci:

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

Le champ _id ne doit pas nécessairement être une MongoDB ObjectId, vous pouvez le définir sur n'importe quelle valeur de n'importe quel type de données (à l'exception d'un tableau); il doit simplement être unique dans la collection.

53
Chris Fulstow

Vous devez ajouter une propriété (ou un champ) pour id et indiquer au sérialiseur quel générateur d'identifiant vous souhaitez utiliser.

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

Il y en a 3 disponibles dans MongoDb Driver ou vous pouvez écrire le vôtre. Plus d'infos sur http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator

9
Wojtek

J'emballe généralement Thingy:

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

Cela facilite beaucoup les choses, car souvent Thingy est une bibliothèque différente de celle sur laquelle je n’ai aucun contrôle. Il est également plus facile de désérialiser afin de le confier à quelqu'un d'autre pour le traitement.

2
Ravi J

Ajouter une propriété comme suit:

public BsonObjectId Id { get; set; }

Le pilote MongoDB convertit automatiquement Id en _id lors de la sérialisation\deserialisation.

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

Selon la classe

Si nécessaire, utilisez le code suivant:

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