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

时间:2012-07-19 09:34:49

标签: 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; }
}

当我尝试这个时:

List<Father> f = result.ToList();

它会调用Element 'Id' does not match any field or property of class Model.Child

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

我该如何处理?谢谢

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

我面临同样的问题。var data = query.ToList();

发生了错误
       var collection = db.GetCollection<Product>("Products");

        var query =
            from e in collection.AsQueryable<Product>()
            where e.name == "kalem"
            select e;

        var data = query.ToList();

我的插入是这样的:

    var collection = db.GetCollection<Product>("Products");

    collection.InsertBatch(products);

我解决了如下。

        ObjectId id = new ObjectId();
        var collection = db.GetCollection<Product>("Products");

        collection.InsertBatch(products);
        id = pr.Id;

我将id添加到Product类中,如下所示 产品类

class Product
{
    public ObjectId Id { get; set; }
    public string name { get; set; }
    public string category { get; set; }
    public double price { get; set; }
    public DateTime enterTime { get; set; }
}

答案 2 :(得分:1)

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

这很好用! [BsonIgnoreExtraElements]也可以很好地工作,但是,如果您想添加其他任何ConventionRegistry(如CamelCaseElementNameConvention),则它将覆盖Attribute,并且会发生相同的异常。不确定是否也可以使用其他属性来实现。

答案 3 :(得分:0)

此功能适用于我的情况:添加标签

    [DataMember]
    [BsonElement("songName")]

元素上:

[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; }}

答案 4 :(得分:0)

我正在使用动态列表(List)来构建过滤器,并且收到了类似的错误。我将这些行添加到数据类中以解决此问题。

[BsonId]
public ObjectId Id { get; set; }

答案 5 :(得分:-1)

您的Child类应该指定它继承父

公共课儿童:父亲{...}

你的父类应该添加已知的类型属性(对于WCF)。

[DataContract]
[KnownType(typeof(Child))]
public class Father

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

if (!BsonClassMap.IsClassMapRegistered(typeof(Child)))
{
    BsonClassMap.RegisterClassMap<Child>(
        cm => { cm.AutoMap(); });
}

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

答案 6 :(得分:-1)

您要做的就是删除ObjecId属性上的[DataMember]并将Id绑定到ObjectId _id。

  

所以你的课应该是这样的:

[DataContract]
public class Father
{
    [BsonId]
    public MongoDB.Bson.ObjectId _id { get; set; }

    [DataMember]
    public string Id { 
          get { return _id.ToString(); }
          set { _id = ObjectId.Parse(value); }
    }

    [DataMember]
    public List<Child> childs { get; set; }
}

ps:在你的情况下,必须手动生成子id,如果你想让它成为objectId(mongo),你将会做同样的技巧 最后,要对对象进行反序列化,您应该使用newtonsoft.json引用并执行此操作

Father = JsonConvert.DeserializeObject<Father>(response.Content);