我正在使用官方的MongoDB C#驱动程序来查询使用驼峰式属性名称的现有文档集合,例如post.title
。
The docs似乎建议不需要将文档映射到带有pascal-cased属性名称的C#POCO,例如:
public class Post
{
public ObjectId Id { get; set; }
public string Title { get; set; }
public string[] Tags { get; set; }
}
但是,在尝试查询集合时,我得到了异常:
元素'title'与MongoDBDemo.Post类的任何字段或属性都不匹配。
如果将Post.Title
更改为Post.title
,则查询执行成功。
有没有办法告诉驱动程序反序列化为pascal-cased属性并默认序列化为驼峰属性?
文档实际上反过来说:
通常,数据库中字段的名称与域类中字段或属性的名称完全相同,但Id是一个例外,并映射到数据库中的_id。
您可以调查创建自己的Convention
来覆盖名称并制作基于Pascal的命名方案。例如,您可以将它自动应用于与MongoDb一起使用的每个类。
或者,您可以通过属性手动指定新名称:
public class Post {
[BsonElement("title")]
public string Title { get; set; }
}
或者,班级地图:
BsonClassMap.RegisterClassMap<Post>(cm => {
cm.AutoMap();
cm.GetMemberMap(c => c.Title).SetElementName("title");
});
我知道这已经很老了,但我发现以下内容可用于将文档中的camelCased字段映射到C#POCO中的PascalCased属性:
var conventionPack = new ConventionPack
{
new CamelCaseElementNameConvention()
};
ConventionRegistry.Register(
name: "CustomConventionPack",
conventions: conventionPack,
filter: t => true);
对于过滤器我使用t => true
,以便这个camelCase约定适用于我的所有实体/集合。
与使用BsonElement
属性相比,这种方法的优点在于,当实体/ POCO不与其中具有mongodb驱动程序引用的项目(例如,在存储库模式中或在干净体系结构中)驻留在同一项目中时,可以使用此方法。
阅读更多官方文档here。
向属性添加属性可以解决这个问题:
public class Post
{
[BsonElement("_id")]
public ObjectId Id { get; set; }
...
}
此外,如果数据库中有任何类中不存在的内容,请添加该属性
[BsonIgnoreExtraElements(true)]
避免收到以前的错误消息。
名称空间MongoDB.Bson.Serialization.Attributes中还有一些其他属性。找到document here。