34

我从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

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

我该如何处理?谢谢

4

7 回答 7

73

[BsonIgnoreExtraElements]您可以通过在类声明之上添加来解决此问题。ObjectId由 MongoDB 内部维护,除非您想从对象中获取其他信息,例如时间戳,否则可能不需要。希望这可以帮助。

于 2019-03-15T15:21:46.030 回答
7
var conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) };
        ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);

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

于 2019-10-21T18:44:52.303 回答
4

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

[BsonId]
public ObjectId Id { get; set; }
于 2019-11-26T19:21:44.693 回答
3

我遇到了同样的问题。同样的错误发生在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到产品类如下产品类

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; }
}
于 2018-01-11T11:59:09.377 回答
3

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

    [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; }}
于 2019-07-18T06:34:26.177 回答
-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); 
于 2016-08-09T13:52:12.870 回答
-2

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

公共类孩子:父亲{ ... }

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

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

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

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

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

于 2013-03-18T22:40:33.933 回答