Entity Framework: 是否有多个 dbcontext?以及其他一些与性能相关的问题

Entity Framework: multiple dbcontext or not? And a few other performance related question

我正在构建一个 calendar/entry/statistics 应用程序,它使用非常复杂的模型,模型之间存在大量关系。

总的来说,我很关心性能,正在考虑不同的策略,并在实施应用程序之前寻找输入。

我是 DBContextPooling 的新手,所以请原谅我可能提出的愚蠢问题。但是 DBContextPooling 与使用多个 DBContext 类 有什么关系,还是与提高性能有关,而不管单个或多个 DBContext?

我最终可能会实施更多 DBsets,还是应该避免?为了简单起见,我正在考虑创建多个 DBContext 类,但这会减少内存使用并提高性能吗?将应用程序拆分成更小的项目会 better/smarter 吗?

使用 IEnumerableICollection 在性能上有什么不同吗?我尽可能避免使用列表。或者使用 IAsyncEnumerable 会更好吗?

你的大部分性能痛点都来自你没有简化的复杂架构。当一个用例踩到另一个用例并且您的关系如此交织在一起时,管理单体应用程序会导致许多不必要的 'compensating' 逻辑。

诸如是否使用上下文池或 IEnumerable 与 ICollection 之类的优化可以稍后进行。它们不应影响您的解决方案的架构。

如果您的项目像您建议的那样复杂,那么我建议您阅读领域驱动设计和微服务并将您的应用程序分解为多个项目(或项目组)。

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/

每个项目(或项目组)都有自己的 DbContext 来管理该项目中的实体。 此外,每个 DbContext 应该首先通过 DbSet 公开聚合根。这可能意味着比特定用例严格需要的数据库 activity 更多,但最好从一个干净的架构开始,并在需要时压榨最后一点性能(有时以架构清晰度为代价)。

例如,如果您想将参加者添加到约会中,直接攻击参加者 table 可能很有吸引力。但是,为了保持整洁,并且考虑到没有预约就不能存在与会者,那么您应该将预约设为聚合根,并且只将预约作为外界攻击的入口点公开。可以从数据库中检索该约会及其出席者。然后要求约会添加与会者。然后通过在 DbContext 上调用 SaveChanges 来保存约会图。

总之,您的约会负责其图表中的功能。您应该要求约会将参加者添加到列表中,而不是将参加者添加到约会的参加者列表中。思维上的微妙转变可以大大降低解决方案的复杂性。

艺术决定了 microservices/contexts 之间的界限应该位于何处。两种不同的架构各有利弊,没有明显的赢家


关于您的其他问题:

DbContext 池是关于维护准备就绪的实例化 DbContext 池。它节省了重复 DbContext 实例化的开销。可能不值得,除非您收到大量单独的请求并且您的分析表明这是一个痛点。

上面提到了所需的 DbSet 数量。

至于IEnumerable或ICollection或IList,这取决于你需要什么功能。这是一个很好的简单总结...... https://medium.com/developers-arena/ienumerable-vs-icollection-vs-ilist-vs-iqueryable-in-c-2101351453db

Would it be better/smarter to split the application into smaller projects?

是的,绝对!从架构清晰开始,然后在需要的地方和时间调整性能优势。不要以性能为目标开始(除非你正在构建一个毫秒敏感的解决方案)。