web-dev-qa-db-ja.com

要素 'Id'は、クラスのどのフィールドまたはプロパティとも一致しません

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」を別のものとして取るだけだと思います。

どうすれば対処できますか?ありがとうございました

21
EasonBlack

クラス宣言の上に[BsonIgnoreExtraElements]を追加することで、同様の問題を解決しました。 ObjectIdは、アプリレベルでは不要なMongoDBによって内部的に維持されるため、クラス宣言ではこのフィールドは必要ありません。これが誰かを助けることを願っています

22
Naga

動的リスト(リスト)を使用してフィルターを作成していましたが、同様のエラーを受け取りました。これらの行をデータクラスに追加して、問題を修正しました。

[BsonId]
public ObjectId Id { get; set; }
2
Tom Glenn
var conventionPack = new ConventionPack { new IgnoreExtraElementsConvention(true) };
        ConventionRegistry.Register("IgnoreExtraElements", conventionPack, type => true);

これは完璧に機能します! [BsonIgnoreExtraElements]もうまく機能しましたが、CamelCaseElementNameConventionのような他のConventionRegistryを追加したい場合は、Attribute 1をオーバーライドし、同じ例外が発生します。他の属性を使用しても実現できるかどうかはわかりません。

2

同じ問題に直面しました。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クラスに以下のProduct Classとして追加しました

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; }
}
1
Mehmet Topçu

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); 

私の場合、この作業:ラベルを追加

    [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; }}
0
Yook Feng