2011-01-24 1 views
0

Modifié le calque de persistance de mon application Web en MongoDb à l'aide des pilotes C# du site MongoDb. A été agréablement surpris de voir tous mes tests passer ... sauf pour une classe. Une de ses propriétés est un type qui implémente IList et pour une raison quelconque, il n'enregistre pas ses éléments.Pilote MongoDb C#, propriété de type implémentant IList ne pas en cours d'enregistrement

J'ai construit un cas de test minimal pour illustrer. Voici le code de test pour créer et enregistrer l'objet parent:

var fooCollection = database.GetCollection<Foo>(typeof(Foo).Name); 
var foo = new Foo {Id = "Root"}; 
foo.Foos.Add(new Foo{ Id = "Child" }); 
fooCollection.Save(foo); 

Si je déclare Foo.Foos comme List<Foo> cela fonctionne:

public class Foo { 
    public Foo() { 
    Foos = new List<Foo>(); 
    } 
    public List<Foo> Foos; 
    public string Id; 
} 

Le (bon) résultat:

{ "_id" : "root", "Foos" : [ { "Foos" : [], "_id" : "child" } ] } 

Cependant, ce dont j'ai besoin est le suivant:

public class Foo { 
    public Foo() { 
    Foos = new FooList(); 
    } 
    public FooList Foos; 
    public string Id; 
} 

public class FooList : IList<Foo> { 
    //IList implementation omitted for brevity 
} 

Le résultat (incorrect) est:

{ "_id" : "root", "Foos" : { "Capacity" : 4 } } 

Notez qu'il n'a rien à voir avec ma mise en œuvre de IList que les résultats sont les mêmes si j'utilise FooList : List<Foo>.

Je présume que le sérialiseur BSON est confus? Je regardais la documentation sur discriminateurs, ce qui m'a amené à penser que cela pourrait aider:

BsonClassMap.RegisterClassMap<List<Foo>>(cm => { 
    cm.AutoMap(); 
    cm.SetIsRootClass(true); 
}); 
BsonClassMap.RegisterClassMap<FooList>();  

Je ne comprends toujours pas mes favoris mais, finit par ressembler à ceci:

{ "_id" : "root", "Foos" : { "_t" : [ "List`1", "FooList" ], "Capacity" : 4 } } 

Comment puis-je enregistrer FooList correctement?

+0

Avez-vous essayé d'ajouter tout 'BsonKnownType' attributs? –

+0

Salut à tous. À moins que je ne me trompe, le code RegisterClassMap que j'ai énuméré ci-dessus équivaut à utiliser les attributs BsonKnownType: http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-Scalarandhierarchicaldiscriminators – nrkn

+0

Pour tout le monde Intéressé par ce problème, nous allons le dénoncer dans le groupe Google mongodb-utilisateur ... toujours pas de chance, sera de retour ici si je trouve une solution. http://groups.google.com/group/mongodb-user/browse_thread/thread/4924584946d3b7d1 – nrkn

Répondre

0

Je suis capable de reproduire ce que vous êtes décrivant avec 0,9, mais il fonctionne correctement avec le dernier code.

Vous pouvez construire vous-même le conducteur du dernier code dans github, ou attente pour 0.11 qui vient très bientôt.

- Robert Stam, sur le monodb-user Google Group

Questions connexes