2012-07-18 2 views
0

J'ai un contrôle Winforms d'un développeur tiers et je veux stocker ses données directement dans un MongoDB. C'est un diagramme de Gantt qui a une liste de ressources et une liste de rendez-vous. Les rendez-vous ont également une liste de ressources à laquelle est responsable la mise en correspondance des rendez-vous avec les ressources.Sérialiser un graphique d'objet avec MongoDB et C#

Pour simplifier le stockage, je créé une classe appelée « PlanningDocument »:

public class PlanningDocument 
{ 
[BsonId] 
public ObjectId Id { get; set; } 
public string Name { get; set; } 
public ResourceCollection Resources { get; set; } 
public ItemCollection Schedule { get; set; } 
} 

le document est correctement stocké dans la base de données (j'utilise MongoVUE pour vérifier le contenu de la base de données). Mais les éléments de la collection "Schedule" ne contiennent pas de références aux ressources telles qu'elles sont pendant l'exécution du programme.

Que dois-je faire pour stocker les relations référencées entre les objets?

EDIT: Je vais essayer d'expliquer ce que je veux faire avec un exemple plus concret:

public class Identity 
    { 
     public string Id; 

     public Identity() 
     { 
      Id = Guid.NewGuid().ToString(); 
     } 
    } 

    public class Thing : Identity 
    { 
     public string Name = ""; 
    } 

    public class Drawer : Identity 
    { 
     public List<Thing> SomeThings; 
     public List<Thing> AdditionalThings; 

     public Drawer() 
     { 
      SomeThings = new List<Thing>(); 
      AdditionalThings = new List<Thing>(); 
     } 
    } 

Je ces classes « chose » et « tiroir ». Le tiroir peut contenir des choses dans "SomeThings" et "AdditionalThings".

var d = new Drawer(); 
d.AdditionalThings.Add(new Thing() { Name = "Thing 1"}); 
d.AdditionalThings.Add(new Thing() { Name = "Thing 2" }); 
d.AdditionalThings.Add(new Thing() { Name = "Thing 3" }); 

d.SomeThings.Add(new Thing() { Name ="Thing A"}); 
d.SomeThings.Add(d.AdditionalThings[0]); 

Lorsque je stocke la même chose dans les deux listes (comme fait avec « Chose 1 » ici), MongoDB stocke une copie de chose 1 - pas une référence.

Ma question est: existe-t-il un moyen générique de faire en sorte que MongoDB et le pilote C# stockent ici une référence au lieu d'une copie?

Merci à l'avance Achim

+0

Il est déconseillé d'essayer et de stocker des références circulaires. Pouvez-vous montrer aux autres classes juste pour être clair sur ce que vous essayez de stocker exactement? –

+0

Les autres classes sont assez complexes, mais je pense que je peux décrire le problème: les ressources sont stockées correctement. Les éléments de ItemCollection contiennent un ResourceCollection avec des références aux ressources. Mais la ResourceCollection de chaque élément est vide après l'enregistrement. –

+0

Quelle version du pilote utilisez-vous? –

Répondre

0

Non, il n'y a aucun moyen de stocker une référence automatiquement dans le pilote C#. Cela est dû au fait que stocker des références impliquerait automatiquement que nous résolvions automatiquement ces références lors de l'exécution, ce que nous ne faisons pas. Etant donné que vos objets "thing" ont une identité, il ne sera pas difficile de les synchroniser lorsque vous mettez à jour l'un d'eux, soit en le faisant côté client, soit en écrivant l'instruction de mise à jour appropriée en utilisant la position $ operator et le drapeau update-multi.

Questions connexes