MongoDB C#驱动程序不会自动执行pascal-cased属性

时间:2014-03-22 09:22:53

标签: mongodb mongodb-.net-driver

我正在使用官方的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属性并默认序列化为驼峰属性?

3 个答案:

答案 0 :(得分:4)

文档实际上反过来说:

  

通常,数据库中字段的名称与之完全相同   域类中字段或属性的名称,但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");
});

答案 1 :(得分:0)

我知道这已经很老了,但是我发现以下内容可用于将文档中的camelCased字段映射到C#POCO中的PascalCased属性:

var conventionPack = new ConventionPack
{
    new CamelCaseElementNameConvention()
};

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

对于过滤器,我使用t => true,以便此camelCase约定适用于我的所有实体/集合。

此方法优于使用BsonElement的优点在于,该方法可用于以下情况:实体不与其中具有mongodb驱动程序的项目位于同一项目中(例如,存储库模式或干净的体系结构) )。

从官方文档here

中了解更多信息

答案 2 :(得分:-1)

向属性添加属性可以解决问题:

public class Post
{

    [BsonElement("_id")]
    public ObjectId Id { get; set; }
    ...
}

此外,如果数据库中有任何类中不存在的内容,请添加属性

[BsonIgnoreExtraElements(true)]

以避免收到上一条错误消息。

命名空间MongoDB.Bson.Serialization.Attributes中还有一些其他属性。找到document here