我在SQL Server数据库上使用Entity Framework 6来查询现有数据库(首先是数据库,所以我的项目中有EDMX)。
我注意到第一次请求实体时,查询执行最多可能需要30秒。对同一对象的后续查询然后在几毫秒内完成。正在执行的实际SQL非常快,因此它不是一个慢查询。
我发现Entity Framework会在后台生成视图,而且这是最可能的罪魁祸首。然而,我找不到的是一个很好的解决方案。有一个可以处理视图生成(EFInteractiveViews)的NuGet包,但是自2014年以来它还没有更新,我几乎找不到任何关于如何使用它的信息。
我现在有什么选择?我已经尝试通过执行一些查询来初始化Application_Start上的Entity Framework,但这似乎并没有多大帮助,而且在{{1}上执行真正的查询也很困难},因为大多数查询都使用当前用户的数据(尚未在Application_Start
登录),因此很难提前运行这些数据。
我已经考虑过创建一个ashx文件,该文件通过调用API并使其保持活动来不断轮询应用程序。我还将应用程序池设置为" AlwaysRunning"这样,当应用程序池被回收时,EF不会重新启动。
有没有人对我如何解决这个或我可以尝试的事情有任何提示或想法?
提前多多感谢。我已经花了两天的时间来寻找可行的解决方案。
答案 0 :(得分:3)
有许多实践可以加速实体框架,我会提到其中的一些
关闭LazyLoading(EDMX =>打开文件右键单击任意位置=> properties => Lazy Loading Enabled
将其设置为false)
使用AsNoTracking().ToList()
,当您想要更新时,请使用Attach
并将对象状态更新为EntityState.Modified
在桌面上使用Indexes
使用Paging
,不要一次加载所有数据
将您的Edmx
拆分为多个较小的,仅包含您页面中所需的那些(这将以良好的方式影响效果)
如果您要加载相关对象“请急切而不是懒惰”,请使用Include
,您可以包含using System.Data.Entity
以使用lambda include功能
拆分Edmx的示例
如果您有租车的以下对象:Country
,City
,Person
,Car
,Rent
,{{1} },Gender
,Engine
,..等等。
现在
如果您正在使用管理(CRUD)人员的屏幕,这意味着您不需要Car,Rent,Manufacturer,因此创建Manufacturers
包含(ManagePerson.edmx
,{{ 1}},Country
,City
)
如果您正在管理(CRUD)汽车,那么您不需要(人,城市,性别,租金),因此您可以创建Person
包含(Gender
,{ {1}},ManageCar.edmx
,Car
)
答案 1 :(得分:1)
实体框架必须首先将您的LINQ查询编译并转换为SQL,但之后它会缓存它们。对查询的第一次打击总是花费很长时间,但正如您在此之后提到的那样,查询将非常快速地运行。
当我第一次使用EF时,它始终是测试人员提出的一个问题,但是当系统上线并经常使用(查询被缓存)时,这不是问题。
请参阅Hadi Hassans关于一般加速提示的答案。