【问题标题】:Using same C# Poco classes with in mongodb and Entityframework在 mongodb 和 Entityframework 中使用相同的 C# Poco 类
【发布时间】:2025-12-29 19:10:16
【问题描述】:

我的域类如下:

public class Author
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Post> Posts { get; set; }
}

public class Blog
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Post> Posts { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public Author Author { get; set; }
    public Blog Blog { get; set; }        
}

如您所见,我绝对没有任何实体框架注释的数据注释或属性,并且我使用实体框架流利的 api 在另一个类中为每个类配置实体框架相关的注释。 现在我想用 MangoDb 替换实体框架。

但在 mongo db 中,我需要在 Id 的列表中放置一个属性,如下所示:

public class Author
{
    [BsonElement("_id")]
    [BsonRepresentation(BsonType.ObjectId)]
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Post> Posts { get; set; }
}

我的问题是有什么办法可以在另一个类之外进行此配置,并且不要像我们在实体框架的流利的 api 中使用的那样触摸我的 poco 类。

【问题讨论】:

  • 好问题。如果我必须在代码中混合实现特定的属性,我总是觉得很烦人。

标签: c# entity-framework mongodb ef-fluent-api


【解决方案1】:

您可以通过使用 BsonClassMap 类来做到这一点,例如:

BsonClassMap.RegisterClassMap<Post>(cm => 
{ 
    cm.MapMember(x => x.Title).SetElementName("_title");
});

文档在这里:Mapping Classes
还有默认约定,Id字段不需要映射到_id名,会自动处理。

【讨论】:

  • 我是否需要在 IMongoCollection 或其他地方为该类设置 RegisterClassMap 的结果?
  • @ViniciusGualberto 不确定我是否理解正确。如果你想应用这个映射,你只需在你想要的任何地方编写映射代码块。通常在应用程序启动时完成。
【解决方案2】:

基本上,您可以同时使用 EntityFramework 和 MongoDB 驱动程序属性。但我不建议您使用在 EntityFramework 中使用的完全相同的数据结构,因为 SQL 和 NoSQL 是完全不同的方法。使用 NoSQL,您应该更多地考虑您的应用程序将如何使用您的数据并创建您的域,选择最佳嵌入策略并相应地应用索引。

您可以在 MongoDB 网站上找到一些不错的读物。以下是一些开始的链接:

http://docs.mongodb.org/manual/core/data-model-design/

http://docs.mongodb.org/manual/core/data-modeling-introduction/

【讨论】:

  • 谢谢你的推荐,但是数据的行为基本上是一样的,我有一个博客,博客有一个作者和帖子......我的问题是找到一种方法来设置mongodb的类之外的相关属性。就像我们在实体框架中使用 fluentApi 创建模型时使用的一样