c# - 整洁架构中 Entity Framework 的实现

标签 c# entity-framework-core .net-5 clean-architecture

我正在研究整洁架构和 Entity Framework ,但很困惑为什么我们需要将实体(数据库/表属性类)放在核心项目中,并将 DbSet--> DbContext 放在基础设施中?对我来说,域只关心业务实体,它可能与数据库实体/数据模型不同,最重要的是,我们正在核心中创建数据层的依赖关系,以及当我们在数据库中的表列更改时发生了什么!这是否意味着我们要更改核心项目中的属性?

最佳答案

其背后的原因是 Entity Framework 模型理论上应该代表您的业务/领域模型,并且与您的数据库存储策略无关。

what happened when we table column change in database

想想大多数表列更改背后的更改原因。

  • 如果您只是发现必须重命名该列才能让数据库管理员满意,您应该能够更改映射(位于您的基础设施项目中),并保留您的实体类完好无损。
  • 如果您要添加新属性,很可能是因为域模型发生了根本性更改:您要添加一些功能,这些功能要求实体上存在新属性。此更改可能会影响您的核心逻辑、UI 和代码的其他部分,因此在核心项目中进行更改是有意义的,然后需要在基础设施项目中进行更改以确保列已添加到数据库中。

也就是说,在实践中,您的域模型最终有可能在某种程度上反射(reflect)您的数据库存储策略。您总是会根据您使用 Entity Framework 等 ORM 的知识,围绕如何存储和检索数据、您希望填充哪些属性等做出设计选择。如果您决定从根本上改变您的数据存储策略(例如使用文档存储),那么您的核心逻辑最终很有可能会发生变化。没有什么是完美的。

但是,如果您采用一种心智模型,其中您的实体代表域模型,而 DbContext 只是与如何存储该模型相关的实现细节,那么您可能会更轻松地执行从 SQL Server 实例切换等操作到 Azure SQL DB 或其他一些兼容的数据库提供程序,而无需重新调整核心代码。

关于c# - 整洁架构中 Entity Framework 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67792496/

相关文章:

c# - Lucene IndexWriter 添加文件慢

c# - 如何在类库项目中首先使用 EF Core Code 创建数据库

c# - CA1416。如何告诉构建器只有平台是 Windows?

c# - 如何启用 C# 9.0-preview

C#、Winform - 创建 PDF

c# - 当前单声道默认垃圾收集器

c# - 如何模拟Azure队列存储进行单元测试?

c# - 将 DBSet 集合作为 bson 文档插入到 Mongodb

c# - EF Core 查询 - 有没有办法按字母顺序查找下一个和上一个项目?

c# - .NET 5 中的 System.Text.Json 字段序列化未在 Swashbuckle API 定义中显示