首页 文章

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

提问于
浏览
3

我正在使用官方的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 回答

  • -1

    文档实际上反过来说:

    通常,数据库中字段的名称与域类中字段或属性的名称完全相同,但Id是一个例外,并映射到数据库中的_id .

    您可以调查创建自己的Convention来覆盖名称并制作基于Pascal的命名方案 . 例如,您可以将它自动应用于与MongoDb一起使用的每个类 .

    或者,您可以通过属性手动指定新名称:

    public class Post {
        [BsonElement("title")]
        public string Title { get; set; }
    }
    

    或者, class Map :

    BsonClassMap.RegisterClassMap<Post>(cm => {
        cm.AutoMap();
        cm.GetMemberMap(c => c.Title).SetElementName("title");
    });
    
  • 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

  • 4

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

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

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

    [BsonIgnoreExtraElements(true)]
    

    避免收到以前的错误消息 .

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

相关问题