gpt4 book ai didi

c# - 无法让 MongoDB C# 驱动程序使用子类和虚拟属性?

转载 作者:行者123 更新时间:2023-12-05 05:27:36 25 4
gpt4 key购买 nike

我正在使用 C# 驱动程序处理 MongoDB。问题是,我想在 MongoDB 中存储不同类型的对象,有一些公共(public)字段和不同的详细信息字段。不同的客户端处理数据库中的不同类型。

代码如下所示:

class Things
{
public string Name {get;set;}
public string User { get; set; }
public ObjectId Id { get; set; }

public virtual Dictionary<string, object> Details { get; set; }
}

class Pc:Things
{
public new Detail Details { get; set; }
}

class Detail
{
public string cpu { get; set; }
public int ram { get; set; }
public int hdd { get; set; }
}

当我执行查询并尝试获取 Pc 对象时,它会抛出一个异常,说明在 Things 中使用了 Details 属性,因此它不能在 Pc 中使用。我猜是在反序列化对象的过程中抛出了预期。

当我再上一个类时:

class Pc2
{
public string Name { get; set; }
public string User { get; set; }
public ObjectId Id { get; set; }
public Detail Details { get; set; }
}

这与 Thing 相同,但使用 Details 作为 Detail 类型,一切正常。

我做错了吗?或者这在 CSharpDriver 的 future 版本中是否可行?

最佳答案

[澄清]

重新阅读您的问题和评论,我意识到我错误地解决了您的问题。您对 new 关键字的使用不是非法的——编译器将允许您在派生类中返回具有相同名称属性的不同类型——实际情况是您告诉编译器派生类的 Details 属性是 独立于其父类。

当你这样做时,通常表明你的类层次结构没有经过深思熟虑,这就是为什么我在最初的帖子中如此教条。

在您的情况下(尝试在 MongoDb 中存储具有不同 Details 的公共(public)类)和多态类层次结构,您正在运行 MongoDb 驱动程序的序列化自动映射。为了做你想做的事,你应该使用 MongoDb documentation 中描述的显式注册你的类映射。 .引用文档的相关部分:

[来源:MongoDb 文档]

The one case where you must call RegisterClassMap yourself (even without arguments) is when you are using a polymorphic class hierarchy: in this case you must register all the known subclasses to guarantee that the discriminators get registered.

关于c# - 无法让 MongoDB C# 驱动程序使用子类和虚拟属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18629206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com