2017-06-14 56 views
0

为了加速我们的测试,我已经将测试切换到使用SQLite :memory:数据库覆盖数据库文件。一切都很顺利,除了一个警告:它会自动加载实体上的导航属性。SQLite内存数据库渴望加载实体

如果我使用实际的数据库文件运行项目并使用Postman命中它,它不会急于加载它们,并且只在我指定我需要时才加载导航属性.Include()

在我切换到测试的SQLite内存数据库之前,它没有这样做。

的的DbContext配置如下:

 Configuration.LazyLoadingEnabled = true; 
     Configuration.ProxyCreationEnabled = false; 
     Configuration.ValidateOnSaveEnabled = true; 

有没有人遇到这个问题?

+0

如果EF以前没有使用.Include()而急切地加载导航属性,那里存在严重错误,它不应该这样做。也许你的意思是懒洋洋地加载导航属性?我不太清楚SQLite如何处理这种情况。 – DevilSuichiro

+0

@DevilSuichiro对不起,这是我的错误,应该说它突然急切地加载,这不是以前。 – Tom

+0

你确定它正在热切加载吗? IQueryable的外观是什么,生成的sql是什么? – DevilSuichiro

回答

1

这是一个旧帖子,但我想我会为任何其他人提供一个答案,绊倒这一点。

这里可能发生的情况很简单,就是您的DbContext将实体缓存在其ChangeTracker中。无论底层提供者如何,当您将实体插入数据库时​​,Entity Framework都会跟踪该实体。如果您查询刚刚插入的实体,实体框架会假定实体不会发生更改,因此将从ChangeTracker返回实体。如果您更改了查询以执行_myDbContext.Set<SomeEntity>().AsNoTracking().ToList(),那么您应该发现它执行查询并仅预取了您指定的相关实体。

+0

This Works!我有点担心这是一种代码味道,因为有代码满足测试,但我认为现在我必须忍受它。 – Tom

+0

谨慎使用AsNoTracking()可以在您的应用程序中获得性能提升,但我不推荐一般使用它。我提出的改变只是确认SqLite确实按预期工作的一种方式。你不应该在任何你想要修改的查询返回实体上使用它。至于测试问题的解决方案,遗憾的是实体框架并没有使那些放弃ORM抽象的人变得特别容易。如果这个设置可以在dbContext级别进行控制,那将会很不错。 –