2016-08-24 62 views
7

我正试图减少EF 6x数据存储测试的启动时间。测试在一个事务中,一旦完成,数据库就会回滚。如果在测试会话之间如何保留DbContext的实例,我将不胜感激,以便EF不必再次完成整个视图生成过程?在测试过程中提高实体框架性能

我不想使用嘲笑/赝品,EF的非微软分支和交互式视图已经到位。谢谢。

+5

您将不得不提供一些代码和更多关于您在做什么的细节,我的意思是这个测试项目是如何设置的。你有多个DbContext实例吗?每个测试一个?每班一个?全球一个?你必须说明初始化很慢,因此它给我们提供了解如何解决它的方法。 – Igor

+0

在实践中,DbContext应该非常轻量级。例如。在Web应用程序中,每个用户请求都有一个这样的实例。他们确实是(或者至少应该是)轻量级对象。因此,您遇到的性能问题可能来自其他地方。也许DbInitializer为你的测试呢?你分析了你的代码吗?也许我错了,虽然... –

+0

你不应该保留一个DbContext实例,并在不同的测试会话中重用它。这与重用DbContext没有什么不同,比如在不同的线程中。这是不好的做法(不是线程安全的)。 –

回答

0

我想推荐您使用in-memory data。我也使用这种模式,它非常好,非常快。这是行业推荐并长期无故障的模式。开发软件应用程序时,请始终尝试使用最佳做法。

当为您的应用程序编写测试时,通常需要避免使用 命中数据库。实体框架允许您通过 创建上下文 - 通过您的测试定义的行为 - 实现 使用in-memory数据。

这里是如何做到这一点的文章:Testing with a mocking framework

的另一篇文章对您:Unit testing in C# using xUnit, Entity Framework, Effort and ASP.NET Boilerplate

+0

谢谢,但我想要一个更快的方式使用真正的交易 – Vas

+0

这不是一个推荐的测试方式。长期来说你会遇到很大的麻烦。 – Sampath

+1

@Sampath为什么不推荐?因为它更慢或?你真的用假提供程序测试 - 一个完美运行的LINQ to Objects查询,在LINQ to Entities的运行时抛出不支持的异常? –

1

不同的选择。当你没有提到你的测试的目的并没有任何代码,选项有:

  1. 如果要插入多条记录到表中,你可以做一个批量插入。最好的图书馆是:EntityFramework.BulkInsert-ef6。您可以通过Nuget控制台进行安装。

  2. 如果在处理数据时看到缓慢并且您有许多加载/操作/保存操作,则必须按照Sampath建议的方法进行内存中操作。

  3. 如果您要加载数据,只需加载所需的列。你也应该使用懒加载选项(从你的文章中,我认为你很清楚)。

4.缓慢的部分原因可能是由于数据库的体系结构。关键列类型对Where操作有相当大的影响!

+0

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