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

感谢克雷格试图解决这个问题。事实证明,我没有正确写出这个问题。

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

于 2012-09-23T22:18:01.323 回答