0

我有一个 mongodb 数据存储,我正在尝试保存由接口 IProject 定义的对象。当我尝试从数据存储区加载对象时,mongo 不知道要使用哪个接口实现,这是可以理解的。我如何告诉 Mongo 始终将接口视为特定对象。即如何将 IProject 映射到 Project?

BsonClassMap.RegisterClassMap<Project>(p =>
    {               
        p.AutoMap();                    
        p.MapField("_leadTimeTrendData").SetElementName("LeadTimeTrendData");
    });

var client = new MongoClient(ConnectionString);
var server = client.GetServer();
var database = server.GetDatabase("projectforecasting");
var projects = database.GetCollection<IProject>("Projects");            
return projects.Find(Query.EQ("Name", name)).FirstOrDefault();

当我尝试加载项目时,这会出现以下错误。

“ProjectForecastingCore.Interface.IProject”类没有名为“_leadTimeTrendData”的字段。

4

1 回答 1

0

您可以使用BsonKnownTypesAttribute,例如

[BsonDiscriminator(Required=true)]
[BsonKnownTypes(typeof(MyProject))]
interface IProject
{ ... }

class MyProject : IProject
{ ... }

这样,MongoDB 将自动存储类型鉴别器 ( {"_t":"MyProject"}),驱动程序知道是什么MyProject并将创建这样的对象实例。

--- 编辑 --- (在 OP 编辑​​之后)

真的IProject是接口吗?错误消息表明它是一个类。如果IProject总是Project这样,打电话不是更容易database.GetCollection<Project>("Projects")吗?这使您不必使用鉴别器。

否则,要使您的代码正常工作,您需要在以下位置提供鉴别RegisterClassMap

BsonClassMap.RegisterClassMap<Project>(p =>
    {               
        p.AutoMap();                    
        p.SetDiscriminator("type");
        p.MapField("_leadTimeTrendData").SetElementName("LeadTimeTrendData");
    });
于 2013-08-27T13:02:16.010 回答