2012-12-19 17 views
9

मैं एक वस्तु इस के समान है:MongoDB एंबेडेड बहुरूपी वस्तुओं

[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; 
} 

मैं संग्रह नामित वाहन है और इस संग्रह में सभी व्युत्पन्न वस्तुओं की दुकान। वाहन ने टाइप 'व्हील' के लिए ऑब्जेक्ट संग्रह एम्बेड किया है। अगर मेरे संग्रह में विभिन्न प्रकार के पहियों हैं, तो उन प्रकारों को deserialized नहीं मिलता है। क्या एम्बेडेड ऑब्जेक्ट्स के लिए मैं पॉलिमॉर्फिज्म का उपयोग कर सकता हूं।

उत्तर

14

तरह व्युत्पन्न प्रकार पंजीकरण के प्रयास करें: एक परीक्षण परियोजना मुझे एहसास हुआ बनाते समय:

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

या की तरह:

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

अद्यतन आप की आवश्यकता है संपत्तियों को
मोंगो डीबी उन्हें सेट नहीं कर सकता है, अगर वे पहुंच योग्य नहीं हैं।

यहाँ परीक्षण कोड है:

[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); 
    } 
} 

संस्थाओं, अपनी लिस्टिंग के समान हैं Propa & Propb है, जो सार्वजनिक किया जाता है के लिए छोड़कर।
मैंने परीक्षण करने में सक्षम होने के लिए Id फ़ील्ड को Vehicle में भी जोड़ा।
परीक्षण हरा है।

+0

की कोशिश की है bsondiscriminator और bsonknowtypes .. काम करने के लिए मुझे लगता है कि ऐसा इसलिए है क्योंकि वस्तुओं एम्बेडेड रहे हैं .. – ajp

+0

मेरी अपडेट हुआ :) – David

+0

आजमाइए और आपको बता दूँगी .. धन्यवाद नहीं मालूम था .. – ajp

संबंधित मुद्दे