Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB嵌入多态对象_C#_Mongodb - Fatal编程技术网

C# MongoDB嵌入多态对象

C# MongoDB嵌入多态对象,c#,mongodb,C#,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

我有一个类似的对象:

[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;
}
[BsonKnownTypes(自行车类型、汽车类型、货车类型))]
公车
{
公共列表轮;
}
公营自行车:汽车
{
}
公营车辆
{
}
公共客货两用车
{
}
[BsonKnownTypes(类型(WheelA),类型(WheelB))]
公共级车轮
{
}
公共级车轮A:车轮
{
私人内部宣传;
}
公共级车轮B:车轮
{
私人int Propb;
}

我有一个名为vehicle的集合,并将所有派生对象存储在此集合中。车辆具有“Wheel”类型的嵌入式对象集合。如果我的集合具有不同类型的控制盘,则不会对这些类型进行反序列化。是否有一种方法可以将多态性用于嵌入式对象。

查看BsonDiscriminator属性

尝试注册派生类型,如:

BsonClassMap.RegisterClassMap<WheelA>();
BsonClassMap.RegisterClassMap<WheelB>();
更新:在创建一个测试项目时,我意识到:您需要公开属性
如果它们不可访问,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);
    }
}
[TestClass]
公共类集成测试
{
[测试方法]
public void多态对象\u应该\u反序列化()
{
var database=MongoDatabase.Create(“连接字符串”);
var collection=database.GetCollection(“车辆”);
var汽车=新车
{
轮子=新列表
{
新车轮a{propA=123},
新车轮B{propB=456}
}
};
收藏。插入(汽车);
var fetched=collection.AsQueryable()
.SingleOrDefault(x=>x.Id==car.Id);
Assert.IsNotNull(fetched.wheels);
AreEqual(2,fetched.wheels.Count);
Assert.IsInstanceOfType(fetched.wheels[0],typeof(WheelA));
Assert.IsInstanceOfType(fetched.wheels[1],typeof(wheelbs));
Assert.AreEqual(123,(fetched.wheels[0]作为WheelA.propA);
Assert.AreEqual(456,(fetched.wheels[1]作为WheelB.propB);
}
}
除了公开的
Propa
Propb
之外,实体与您的列表相同。
我还将
Id
字段添加到
Vehicle
,以便能够对其进行测试。

测试为绿色。

已尝试使用bsondiscriminator和bsonknowtypes。。似乎不起作用,我想这是因为对象是嵌入的。+1
BsonDiscriminator
至关重要。回答得很好。我使用了[BsonDiscriminator(RootClass=true)]而不是[BsonDiscriminator(Required=true)],这很有效!谢谢他们还必须有一个二传手。它们可以是私人的。@David,有做空的选择吗?我有一个班有很多(20)个孩子,我不喜欢这样,我必须一个接一个地写
[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);
    }
}