2016-05-05 89 views
0

我正在學習MongoDB,我想用C#嘗試它。是否可以使用C#官方MongoDB驅動程序對強類型的MongoDB文檔進行操作?mongoDB,使用C#官方驅動程序的強類型集合

我有類AlbumPhoto

public class Album : IEnumerable<Photo> 
    { 
     [Required] 
     [BsonElement("name")] 
     public string Name { get; set; } 

     [Required] 
     [BsonElement("description")] 
     public string Description { get; set; } 

     [BsonElement("owner")] 
     public string Owner { get; set; } 

     [BsonElement("title_photo")] 
     public Photo TitlePhoto { get; set; } 

     [BsonElement("pictures")] 
     public List<Photo> Pictures { get; set; } 

     //rest of the class code 
    } 

public class Photo : IEquatable<Photo> 
    { 
     [BsonElement("name")] 
     public string Name; 

     [BsonElement("description")] 
     public string Description; 

     [BsonElement("path")] 
     public string ServerPath; 

     //rest of the class code 
    } 

我要插入一個新的文檔到一個集合albumstest數據庫。我不想在BsonDocument上操作,但我更願意使用強類型Album。我認爲這將是這樣的:

IMongoClient client = new MongoClient(); 
IMongoDatabase db = client.GetDatabase("test"); 
IMongoCollection<Album> collection = database.GetCollection<Album>("album"); 
var document = new Album 
      { 
       Name = album.Name, 
       Owner = HttpContext.Current.User.Identity.Name, 
       Description = album.Description, 
       TitlePhoto = album.TitlePhoto, 
       Pictures = album.Pictures 
      }; 
collection.InsertOne(document); 

但它給我下面的錯誤:

An exception of type 'MongoDB.Driver.MongoCommandException' occurred in MongoDB.Driver.Core.dll but was not handled in user code

Additional information: Command insert failed: error parsing element 0 of field documents :: caused by :: wrong type for '0' field, expected object, found 0: [].

什麼我做錯了,如果有可能實現嗎?

+0

[這可能是幫助](http://www.codeproject.com/Articles/273145/Using-MongoDB-with-the-Official-Csharp-Driver) – Chandralal

回答

1

它看起來像驅動程序將您的對象視爲BSON陣列,因爲它實現了IEnumerable<Photo>。數據庫正在等待一個BSON文檔。如果您嘗試將Int32插入到集合中,則會出現類似的錯誤。

不幸的是,我不知道如何配置串行器來將你的Album對象當作BSON文檔。靜態BsonSerializer.SerializerRegistry屬性顯示驅動程序默認選擇使用EnumerableInterfaceImplementerSerializer<Album,Photo>作爲Album的序列化程序。

Album中刪除IEnumerable<Photo>實現導致驅動程序與BsonClassMapSerializer<Album>序列化,生成一個BSON文檔。雖然它可行,但缺點是Album不再可枚舉;應用程序用戶將需要枚舉Pictures屬性。

添加IEnumerable<Photo>執行回,然後迫使上述串行器(使用[BsonSerializer(typeof(BsonClassMapSerializer<Album>))]屬性)導致:基於堆棧跟蹤(指BsonSerializerAttribute.CreateSerializer

System.MissingMethodException: No parameterless constructor defined for this object.

,所述對象的消息指的是出現是序列化相關的東西,而不是數據對象本身(我爲兩者定義了無參數構造函數)。我不知道是否有進一步配置的方法解決這個問題,或者如果驅動程序不允許以這種方式使用IEnumerable

+0

感謝您的建設性意見。我不知道「IEnumerable」是個問題。現在,我已經通過刪除該接口來解決該問題,並且實現了自己的迭代器,因爲我只需要遍歷所有連續的照片。 –

相關問題