我正在学习MongoDB,我想尝试使用C#。是否可以使用C#官方MongoDB驱动程序对强类型MongoDB文档进行操作?
我有课程Album
和Photo
:
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:[]。
我做错了什么,是否有可能实现?
答案 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
。