在测试期间提高Entity Framework的性能

7
我正在尝试缩短与EF 6x数据存储的测试启动时间。这些测试位于事务内部,一旦完成,数据库就会回滚。我希望能提出任何建议,以便在测试会话之间保留DbContext实例,从而使EF不必再次经历整个视图生成过程。
我不想使用模拟/伪造,非Microsoft分支的EF和交互式视图已经到位。谢谢。

5
您需要提供一些代码以及更多关于您正在进行的工作的详细信息,也就是说,这个测试项目是如何设置的。您是否有多个DbContext实例?每个测试一个?每个类一个?还是一个全局的?您必须阐明初始化过程缓慢的原因,以便让我们了解可以采取什么措施来解决它。 - Igor
一个DbContext在实践中应该非常轻量化。例如,在Web应用程序中,每个用户请求都有一个这样的实例。它们确实是(或者至少应该是)轻量级的对象。因此,您遇到的性能问题可能来自其他地方。也许是您测试用的DbInitializer?您有对代码进行过分析吗?也许我是错的... - turdus-merula
你不应该保留一个 DbContext 实例并在不同的测试会话之间重复使用它。这与在不同的线程之间重复使用 DbContext 没有什么区别。这是一种不好的做法(不安全的线程)。 - turdus-merula
1
将数据库缓存到Docker镜像中,每次启动新容器? - Technetium
2个回答

1
不同的选择。由于您没有提及测试目的和任何代码,因此选项如下:
  1. 如果您正在向表中插入许多记录,则可以执行批量插入。最好的库是:EntityFramework.BulkInsert-ef6。您可以通过Nuget控制台安装它。

  2. 如果在处理数据时出现缓慢,并且有许多加载/操作/保存操作,则必须像Sampath建议的那样进行内存操作。

  3. 如果正在加载数据,请只加载所需的列。您还应该使用延迟加载选项(从您的帖子中,我认为您已经很了解它)。

4.某些缓慢可能是由于数据库架构造成的。关键列类型对Where操作有相当大的影响!


感谢您的回复。问题是关于在测试会话之间保留相同的 DbContext 运行实例。谢谢。 - Vas

0

我想推荐您使用内存数据。我也使用了这种模式,它非常好用且速度非常快。这是业界推荐的模式,在长期运行中无需担心问题。在开发软件应用程序时,始终尝试使用最佳实践。

编写应用程序测试时,通常希望避免访问数据库。Entity Framework 允许您通过创建一个上下文 - 其行为由您的测试定义 - 并利用内存数据来实现此目的。

这里有一篇关于如何做到这一点的文章:使用模拟框架进行测试

另一篇文章供您参考:使用 xUnit、Entity Framework、Effort 和 ASP.NET Boilerplate 进行 C# 单元测试


1
谢谢,但我想要一个更快速的使用真实代码的方法。 - Vas
那不是一种推荐的测试方式。从长远来看,你会遇到大麻烦。 - Sampath
2
@Sampath 为什么不推荐使用?是因为它更慢吗?你真正测试的是什么 - 在 LINQ to Entities 运行时抛出“不支持”的异常,而在对象查询中完美运行的 LINQ 查询吗? - Ivan Stoev
@IvanStoev 是的,由于速度缓慢和许多其他维护相关问题,OP现在也正在经历。我正在使用ASP.net Boilerplate进行应用程序开发。该框架上的“内存数据”测试模式是默认设置。https://www.aspnetzero.com/ - Sampath
如果你不想使用模拟/伪造对象,那么根据定义来说,你是在“做错了”。 - Paul Swetz
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接