获取基类的文档并在一个查询中继承类

问题描述 投票:2回答:2

我有Mongo CollectionTaskBase文件。 TaskBase有三个子类。我为这个集合创建了一个集合管理器(来自我已经使用过的通用管理器)。当我创建,更新或检索TaskBase的子类时,我得到了正确的类型,没有例外。

我创建了以下方法:

public IEnumerable<TaskBase> GetTasksByAppId(string appId)
{
   var entityQuery = Query<TaskBase>.EQ(t => t.AppOId, appId);
   return this.MongoConnectionHandler.MongoCollection.Find(entityQuery).ToList();
}

当我运行这个时,我得到一个例外,Element [some element existing only in a subclass] is not a property or member of TaskBase我理解为什么我得到这个例外,我只是不知道该怎么做。我想获得可以与应用程序关联的所有类型的任务的集合。

c# .net mongodb polymorphism mongodb-.net-driver
2个回答
5
投票

您需要向驱动程序显示您的类层次结构。有两个选项,第一个使用BsonKnownTypesBsonDiscriminator属性,另一个使用BsonClassMap

属性

使用您想要包含的特定派生类来装饰您的基类(类似于您在WCF中所做的操作)。告诉司机它是你需要BsonDiscriminator的根:

[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(ConcreteTask))]
public class TaskBase
{

}

BsonClassMap

BsonClassMap.RegisterClassMap<TaskBase>();
BsonClassMap.RegisterClassMap<ConcreteTask>();

结果

因此,文档的类型鉴别符(_t)将是一个数组,而不是单个值。在这种情况下:

{ _t : ["TaskBase", "ConcreteTask"] }

0
投票

派对有点晚了,在i3arnon的回答之后,如果你想向你的类层次结构显示你的类层次结构而没有向你的类添加属性,你可以用这样的方式跟随BsonClassMap选项

        BsonClassMap.RegisterClassMap<TaskBase>(cm =>
        {
            cm.AutoMap();
            cm.SetIsRootClass(true);
        });

        BsonClassMap.RegisterClassMap<ConcreteTask>(cm =>
        {
            cm.AutoMap();
        });

得到相同的结果:{_ t:[“TaskBase”,“ConcreteTask”]}

© www.soinside.com 2019 - 2024. All rights reserved.