2012-09-17 177 views
0

我正在使用MongoDB將文檔反序列化成C#對象,並且遇到ObjectID字段的問題。這是我得到的錯誤: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

那麼序列化過程的其他方面可以防止這個元素被填充?在特定版本的驅動程序中是否有錯誤?我使用正確的數據類型嗎?

還應當指出的是:

  • 這個文件是用來填充數據庫中的該值,所以似乎只有deserialisation是一個問題,系列化的罰款。
  • 同一個庫中還有其他文件存在相同的問題。
  • 有蒙戈文件/在同一個解決方案,但在不同的庫,它似乎並不具有相同的prolem合同,
+0

如果您正確地從LayoutId中刪除了BsonRequired屬性,問題是否消失? –

+0

@CraigWilson如果我這樣做,那麼該字段保持爲空。因此,在反序列化過程中,BSON字段沒有與類字段匹配。 – Nippysaurus

回答

0

謝謝克雷格試圖解決這個問題。事實證明,我沒有正確寫下這個問題。

問題是我對結果調用了「SetFields()」,並且我請求的字段中沒有包含「LayoutId」。儘管如此,我還是會期望司機會有更多的描述性錯誤。

+0

不知道你想要什麼類型的更好的錯誤信息。它特別提到LayoutId丟失。你有一個更好的錯誤信息的建議嗎? –

+0

@CraigWilson那麼驅動程序知道你要反序列化的類是什麼,它知道你正在請求什麼字段。因此,「從字段列表中指定的缺少必填字段」的行可能更有用。 – Nippysaurus

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(); 
     } 
    } 
} 
+0

您的示例代碼非常好地加載文檔。我可能會補充說,還有其他包含object-id的文檔可以正常工作,所以可能有一些與非mongo相關的文檔會導致反序列化失敗。 – Nippysaurus

相關問題