MongoDB(C#驱动程序)问题反序列化ObjectID字段

时间:2012-09-17 00:47:50

标签: c# mongodb mongodb-.net-driver

我使用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; }

  }
}

它填充在数据库中:

enter image description here

那么序列化过程的其他方面可能会阻止此元素被填充?特定版本的驱动程序中是否存在错误?我使用的是正确的数据类型吗?

还应该注意:

  • 这个文档用于在数据库中填充该值,因此看起来只有反序列化才是问题,序列化也没问题。
  • 同一个库中还有其他文档存在同样的问题。
  • 在相同的解决方案中有mongo文档/合同,但在不同的库中似乎没有相同的问题,

2 个答案:

答案 0 :(得分: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();
        }
    }
}

答案 1 :(得分:0)

感谢Craig试图解决这个问题。事实证明我没有正确地写出这个问题。

问题是我在结果上调用了“SetFields()”,而我请求的字段不包含“LayoutId”。我原本期望驱动程序出现更具描述性的错误。