mongoDB,使用C#oficial驱动程序的强类型集合

时间:2016-05-05 19:04:19

标签: c# mongodb insert

我正在学习MongoDB,我想尝试使用C#。是否可以使用C#官方MongoDB驱动程序对强类型MongoDB文档进行操作?

我有课程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
    }

我想将新文档插入albums数据库中的集合test。我不想在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);

但它给了我以下错误:

  

发生了'MongoDB.Driver.MongoCommandException'类型的异常   在MongoDB.Driver.Core.dll中,但未在用户代码中处理

     

其他信息:命令插入失败:解析元素0时出错   字段文件::由::错误类型引起的'0'字段,预期   对象,找到0:[]。

我做错了什么,是否有可能实现?

1 个答案:

答案 0 :(得分:1)

看起来驱动程序将您的对象视为BSON数组,因为它实现了IEnumerable<Photo>。数据库正在期待BSON文档。如果您尝试将Int32插入集合中,则会收到类似的错误。

很遗憾,我不知道如何配置序列化程序以将您的Album对象视为BSON文档。静态BsonSerializer.SerializerRegistry属性显示默认情况下驱动程序选择将EnumerableInterfaceImplementerSerializer<Album,Photo>用作Album的序列化程序。

IEnumerable<Photo>删除Album实现会导致驱动程序使用BsonClassMapSerializer<Album>序列化,从而生成BSON文档。虽然它有效但缺点是Album不再可以枚举;应用程序使用者需要枚举Pictures属性。

重新添加IEnumerable<Photo>实现,然后强制使用上述序列化程序(使用[BsonSerializer(typeof(BsonClassMapSerializer<Album>))]属性)会导致:

  

System.MissingMethodException:没有为此对象定义无参数构造函数。

基于堆栈跟踪(引用BsonSerializerAttribute.CreateSerializer),消息引用的对象看起来与序列化相关,而不是数据对象本身(我为两者定义了无参数构造函数)。我不知道是否可以通过进一步配置来解决这个问题,或者如果驱动程序只是不允许以这种方式使用IEnumerable