MongoDB C#驱动程序不自动映射pascal外壳属性

MongoDB C#驱动程序不自动映射pascal外壳属性,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我正在使用官方的MongoDB C#驱动程序查询使用驼峰式属性名称的现有文档集合,例如post.title 似乎表明无需将文档映射到具有pascal大小写属性名称的C#POCO,例如: public class Post { public ObjectId Id { get; set; } public string Title { get; set; } public string[] Tags { get; set; } } 但是,在尝试查询集合时,我遇到异常: 元

我正在使用官方的MongoDB C#驱动程序查询使用驼峰式属性名称的现有文档集合,例如
post.title

似乎表明无需将文档映射到具有pascal大小写属性名称的C#POCO,例如:

public class Post
{
    public ObjectId Id { get; set; }
    public string Title { get; set; }
    public string[] Tags { get; set; }
}
但是,在尝试查询集合时,我遇到异常:

元素“title”与mongodbemo.Post类的任何字段或属性都不匹配

如果将
Post.Title
更改为
Post.Title
,查询将成功执行


有没有办法告诉驱动程序在默认情况下反序列化为pascal大小写的属性并序列化为驼峰大小写的属性?

向属性添加一个属性就可以了:

public class Post
{

    [BsonElement("_id")]
    public ObjectId Id { get; set; }
    ...
}
此外,如果数据库中有任何类中不存在的内容,请添加该属性

[BsonIgnoreExtraElements(true)]
以避免获取以前的错误消息


命名空间MongoDB.Bson.Serialization.attributes中还有一些其他属性。查找。

文档实际上说的是相反的:

通常,数据库中字段的名称与 域类中字段或属性的名称,但Id是 异常,并映射到数据库中的_id

您可以研究创建自己的名称来覆盖这些名称,并创建基于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");
});
BsonClassMap.RegisterClassMap(cm=>{
cm.AutoMap();
cm.GetMemberMap(c=>c.Title).SetElementName(“Title”);
});

我知道这很旧,但我发现可以使用以下方法将文档中的camelCased字段映射到C#POCOs中的PASCALCASE属性:

对于过滤器,我使用的是
t=>true
,因此这个camelCase约定适用于我的所有实体/集合

与使用
bsonement
属性相比,这种方法的优势在于,当实体/POCO与其中包含mongodb驱动程序引用的实体/POCO不在同一个项目中时(例如,在存储库模式中,或在干净的体系结构中),可以使用这种方法


阅读官方文档中的更多内容。

没有可以定制的内容吗?@NeilLunn该链接似乎已经改变。你指的是什么?此外,OP中的链接也发生了变化。你能更新一下吗Ben Foster?他改变问题了吗?你的回答甚至没有提到他的问题。是的,事实上是这样。您可以创建约定,或使用属性或类映射来调整C#中字段的大小写。链接似乎已更改。你能更新一下吗?我会自己做的,但只是想确保我没有改变什么?一个简短的问题:有没有办法让我所有的实体都自动完成这个任务?@wiredparie没关系,我已经找到了我问题的答案,并在这个帖子中添加了我自己的答案:-)他改变了问题吗?你的回答甚至没有解决他的问题。
var conventionPack = new ConventionPack
{
    new CamelCaseElementNameConvention()
};

ConventionRegistry.Register(
    name: "CustomConventionPack", 
    conventions: conventionPack,
    filter: t => true);