我从MongoDB中的集合得到了结果,结构如下所示
[DataContract]
public class Father
{
[BsonId]
[DataMember]
public MongoDB.Bson.ObjectId _id { get; set; }
[DataMember]
public string Id { get; set; }
[DataMember]
public List<Child> childs { get; set; }
}
[DataContract]
public class Child
{
[DataMember]
public string Id { get; set; }
[DataMember]
public int Name { get; set; }
}
当我尝试这个:
List<Father> f = result.ToList();
它调用Element 'Id' does not match any field or property of the class Model.Child
我认为它只是把“身份”当作了别的东西。
我该怎么处理呢?谢谢
9条答案
按热度按时间6mzjoqzu1#
你可以通过在类声明的顶部添加
[BsonIgnoreExtraElements]
来解决这个问题。ObjectId
由MongoDB内部维护,除非你想从对象中获得额外的信息,比如时间戳,否则可能不需要它。希望这能有所帮助。2nbm6dog2#
这非常好用![BsonIgnoreExtraElements]也很好用,但是,如果你想添加任何其他ConventionRegistry,比如CamelCaseElementNameConvention,那么,它会覆盖属性1,并且发生同样的异常。不确定使用其他属性是否也能实现这一点。
igetnqfo3#
我在使用动态列表(List)构建过滤器时收到了类似的错误。我将这些行添加到我的数据类中以解决此问题。
klsxnrf14#
这适用于我情况:添加属性
元素:
jgzswidk5#
我遇到了同样的问题。同样的错误发生在
var data = query.ToList();
我的插入是这样的:
我解决如下。
并且我将
id
添加到Product class中,如下所示8aqjt8rx6#
可以使用BsonNoId属性
yruzcnhs7#
只需要在类[BsonIgnoreExtraElements]的顶部添加这个
gupuwyp28#
您所要做的就是删除ObjectId属性上的[DataMember]并将Id绑定到ObjectId _id。
因此您的类应该如下所示:
ps:在您的例子中,子id必须手动生成,如果您希望它是一个objectId(mongo),您将不得不做同样的技巧最后,要反序列化对象,您应该使用newtonsoft.json引用,并像这样做
kupeojn69#
您的Child类可能应该指定它继承了Father
公共类Child:父亲
您的Father类可能应该添加已知类型属性(对于WCF)。
如果这是一个MongoCollection(“父亲”),您可以通过它来保存/获取,那么您可能需要为每个预期的子类型注册一个类Map。
正如@alexjamesbrown提到的,你不需要将poco对象的id字段命名为'_id'。继承的思想是继承。所以使用Father的“id”字段(不管它被命名为什么)就足够了。不清楚为什么你的Father类同时具有Id和_id属性。其中一个可能是不必要的。