12

私はこれに似たオブジェクトを持っています:

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

vehicle という名前のコレクションがあり、このコレクションにすべての派生オブジェクトを格納しています。車両には、タイプ「ホイール」のオブジェクト コレクションが埋め込まれています。コレクションに異なるタイプのホイールがある場合、それらのタイプは逆シリアル化されません。埋め込みオブジェクトにポリモーフィズムを使用する方法はありますか?

4

2 に答える 2

18

次のような派生型を登録してみてください。

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

または好き:

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

更新:テスト プロジェクトを作成しているときに、プロパティを publicにする必要があることに気付きました。
アクセスできない場合、MongoDB はそれらを設定できません。

テストコードは次のとおりです。

[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
IdVehicle

于 2013-01-04T19:37:12.170 に答える