元素'Id'与类的任何字段或属性都不匹配

Eas*_*ack 17 mongodb mongodb-.net-driver

我从Mongo的集合中得到了结果,结构与此相同

[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; }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试这个:

List<Father> f = result.ToList();
Run Code Online (Sandbox Code Playgroud)

它叫 Element 'Id' does not match any field or property of the class Model.Child

我认为它只是把'Id'作为别的东西.

我怎么处理它?谢谢

Nag*_*aga 15

我通过在类声明的顶部添加[BsonIgnoreExtraElements]解决了类似的问题。ObjectId由MongoDB内部维护,在App级别不需要,因此在类声明中我不需要此字段。希望这会帮助某人

  • 这个答案几年前就应该被接受。 (4认同)

小智 7

I was using a dynamic list (List) to build a filter and was receiving a similar error. I added these lines to my data class to fix the problem.

[BsonId]
public ObjectId Id { get; set; }
Run Code Online (Sandbox Code Playgroud)


小智 6

这适用于我的情况:添加属性

    [DataMember]
    [BsonElement("songName")]
Run Code Online (Sandbox Code Playgroud)

到元素上:

[BsonIgnoreExtraElements]
public class Music
{
   
    [BsonId]
    [DataMember]
    public MongoDB.Bson.ObjectId _id { get; set; }
    [DataMember]
    public string Id { get; set; }

    [DataMember]
    [BsonElement("songName")]
    public string SongName { get; set; }

    [DataMember]
    [BsonElement("artistName")]
    public string ArtistName { get; set; }}
Run Code Online (Sandbox Code Playgroud)


Abh*_*yal 6

var conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) };
        ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);
Run Code Online (Sandbox Code Playgroud)

这工作得很好![BsonIgnoreExtraElements] 也运行良好,但是,如果您想添加任何其他 ConventionRegistry,如 CamelCaseElementNameConvention,那么它会覆盖 Attribute one,并且会发生相同的异常。不确定是否也可以使用其他一些属性来实现。


Nuk*_*San -2

你的 Child 类可能应该指定它继承 Father

公开课 孩子:父亲 { ... }

您的 Father 类可能应该添加已知类型属性(对于 WCF )。

[DataContract]
[KnownType(typeof(Child))]
public class Father
Run Code Online (Sandbox Code Playgroud)

如果这是您保存/获取的 MongoCollection("fathers"),那么您可能需要为每个预期的子类型注册一个类映射。

if (!BsonClassMap.IsClassMapRegistered(typeof(Child)))
{
    BsonClassMap.RegisterClassMap<Child>(
        cm => { cm.AutoMap(); });
}
Run Code Online (Sandbox Code Playgroud)

正如 @alexjamesbrown 提到的,您不需要在 poco 对象“_id”上命名 id 字段。继承的想法就是继承。因此,使用父亲的“id”字段(无论它的名称是什么)就足够了。目前尚不清楚为什么您的 Father 类同时具有 Id 和 _id 属性。其中之一可能是不必要的。