2012-09-17 3 views
0

MongoDB를 사용하여 문서를 C# 개체로 deserialize하고 ObjectID 필드에 문제가 있습니다. 이것은 내가 점점 오전 오류입니다 : 속성에 대한 'LayoutId'MongoDB (C# Driver)는 ObjectID 필드 deserialising을 발행합니다.

필수 요소없는 클래스 MyProject.Data.MyDocument의 '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

를 (그것이 어쨌든 이상한 보이지 않는 경우)

어떤는 LayoutId 필드가 지정되어 있기 때문에 이해하지 따라서 직렬화 프로세스의 다른 측면에서이 요소가 채워지는 것을 막을 수 있습니까? 특정 버전의 드라이버에 버그가 있습니까? 올바른 데이터 유형을 사용하고 있습니까?

  • 이 문서가 데이터베이스에 그 값을 채우는 데 사용되는, 그래서 단지 deserialisation이 문제가 직렬화가 좋은 것 같습니다 :

    또한 주목해야한다.

  • 동일한 라이브러리에 동일한 문제점이있는 다른 문서가 있습니다.
  • 내가이 오류를 재현 할 수없는
+0

LayoutId에서 BsonRequired 특성을 올바르게 제거하면 문제가 해결됩니까? –

+0

@CraigWilson 내가 그렇게하면 필드는 null로 남습니다. 따라서 deserialisation 프로세스의 어딘가에서 BSON 필드가 Field 클래스와 일치하지 않습니다. – Nippysaurus

답변

0

이 문제를 해결해 주신 Craig에게 감사드립니다. 나는 그 질문을 제대로 쓰지 않았다는 것이 밝혀졌다.

문제는 내가 "SetFields()"를 결과에 호출하고 요청한 필드에 "LayoutId"가 포함되지 않았기 때문입니다. 나는 운전사에게서 더 기술적 인 과실을 예상했을 것입니다.

+0

어떤 유형의 더 나은 오류 메시지를 원하는지 확실하지 않습니다. 특히 LayoutId가 누락되었다고 언급했습니다. 더 나은 오류 메시지에 대한 제안 사항이 있으십니까? –

+0

@CraigWilson 글쎄 드라이버는 당신이 deserialize하고 당신이 요청하는 필드를 알고있는 클래스를 알고있다. 따라서 "필드 목록에 지정된 필수 필드가 누락되었습니다"라는 라인을 따라 뭔가가 더 유용 할 수 있습니다. – Nippysaurus

1

, 몽고 문서/동일한 솔루션에 있지만 같은 prolem을 갖고있는 것 같다하지 않는 다른 라이브러리에 계약이있다. 테스트 프로그램으로 질문을 업데이트 할 수 있습니까?

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를 포함하고있는 다른 문서가 있다는 것을 추가 할 수도있다. 그래서 문서가 deserialization을 실패하게하는 non-mongo-related와 같은 것이있을 것이다. – Nippysaurus

관련 문제