0

MongoDB を使用してドキュメントを C# オブジェクトにデシリアライズしていますが、ObjectID フィールドに問題があります。これは私が得ているエラーです:

クラス MyProject.Data.MyDocument のプロパティ 'LayoutId' に必要な要素 'LayoutId' がありません。

LayoutIdフィールドが指定されているため、どちらが(とにかく奇妙に見えない場合)意味があります。

using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace MyProject.Data
{
  public class MyDocument
  {

    public override ObjectId Id { get; set; }

    [BsonRequired]
    public String Name { get; set; }

    [BsonRequired]
    public ObjectId LayoutId { get; set; }

  }
}

そして、データベースに入力されます:

ここに画像の説明を入力

シリアライゼーション プロセスの他のどのような側面が、この要素への入力を妨げる可能性があるでしょうか? 特定のバージョンのドライバーにバグはありますか? 正しいデータ型を使用していますか?

また、次の点にも注意してください。

  • このドキュメントはデータベースにその値を入力するために使用されたため、逆シリアル化のみが問題であり、シリアル化は問題ないようです。
  • 同じライブラリに同じ問題のある他のドキュメントがあります。
  • 同じソリューションにmongoドキュメント/コントラクトがありますが、同じ問題を抱えていないように見える別のライブラリにあります。
4

2 に答える 2

1

このエラーを再現できません。テストプログラムで質問を更新できますか?

using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace TestConsole_Source
{
    class Program
    {
        public class MyDocument
        {
            public ObjectId Id { get; set; }

            [BsonRequired]
            public string Name { get; set; }

            [BsonRequired]
            public ObjectId LayoutId { get; set; }
        }

        static void Main(string[] args)
        {
            var server = MongoServer.Create();
            server.Connect();

            var db = server.GetDatabase("docstest");
            var collection = db.GetCollection<MyDocument>("docs");
            collection.Drop();

            var doc = new MyDocument
            {
                Name = "Test",
                LayoutId = ObjectId.GenerateNewId()
            };

            collection.Save(doc);

            var foundDoc = collection.FindOne();
            //Console.ReadKey();
        }
    }
}
于 2012-09-18T02:21:58.727 に答える
0

この問題の解決を試みてくれた Craig に感謝します。私が質問を適切に書いていなかったことが判明しました。

問題は、結果に対して「SetFields()」を呼び出していて、要求したフィールドに「LayoutId」が含まれていなかったことです。ただし、ドライバーからのより説明的なエラーが予想されていました。

于 2012-09-23T22:18:01.323 に答える