2012-12-19 5 views
9

j'ai un objet semblable à ceci:MongoDB objets polymorphes intégrés

[BsonKnownTypes(typeof(Bike), typeof(Car), typeof(Van))] 
public class Vehicle 
{ 
    public List<Wheel> wheels; 
} 

public class Bike: Vehicle 
{ 

} 

public class Car: Vehicle 
{ 

} 

public class Van: Vehicle 
{ 

} 

[BsonKnownTypes(typeof(WheelA), typeof(WheelB))] 
public class Wheel 
{ 

} 

public class WheelA: Wheel 
{ 
    private int Propa; 
} 

public class WheelB: Wheel 
{ 
    private int Propb; 
} 

J'ai véhicule nommé collection et de stocker tous les objets dérivés dans cette collection. Le véhicule a une collection d'objets intégrée pour le type 'Roue'. Si ma collection comporte différents types de roues, celles-ci ne sont pas désérialisées. Est-il possible d'utiliser le polymorphisme pour les objets incorporés.

Répondre

14

Essayez de vous enregistrer les types dérivés comme:

BsonClassMap.RegisterClassMap<WheelA>(); 
BsonClassMap.RegisterClassMap<WheelB>(); 

ou comme:

[BsonDiscriminator(Required = true)] 
[BsonKnownTypes(typeof(WheelA), typeof(WheelB))] 
public class Wheel 

MISE À JOUR: Lors de la création d'un projet de test, j'ai réalisé: vous besoin de rendre les propriétés publiques.
MongoDB ne peut pas les définir s'ils ne sont pas accessibles.

est ici le code de test:

[TestClass] 
public class IntegrationTests 
{ 
    [TestMethod] 
    public void Polymorphic_objects_should_deserialize() 
    { 
     var database = MongoDatabase.Create("connection_string"); 
     var collection = database.GetCollection("vehicles"); 

     var car = new Car 
     { 
      wheels = new List<Wheel> 
         { 
          new WheelA {propA = 123}, 
          new WheelB {propB = 456} 
         } 
     }; 
     collection.Insert(car); 

     var fetched = collection.AsQueryable<Car>() 
         .SingleOrDefault(x => x.Id == car.Id); 

     Assert.IsNotNull(fetched.wheels); 
     Assert.AreEqual(2, fetched.wheels.Count); 

     Assert.IsInstanceOfType(fetched.wheels[0], typeof(WheelA)); 
     Assert.IsInstanceOfType(fetched.wheels[1], typeof(WheelB)); 

     Assert.AreEqual(123, (fetched.wheels[0] as WheelA).propA); 
     Assert.AreEqual(456, (fetched.wheels[1] as WheelB).propB); 
    } 
} 

Les entités sont identiques à votre liste, à l'exception des Propa & Propb, qui sont rendus publics.
J'ai également ajouté un champ Id à Vehicle pour pouvoir le tester.
Le test est vert.

+0

ont essayé bsondiscriminator et bsonknowtypes .. ne semble pas fonctionner, je pense qu'il est parce que les objets sont intégrés .. – ajp

+0

voir ma mise à jour :) – David

+0

donnera un essai et vous faire savoir .. merci .. – ajp

Questions connexes