实体框架 edmx 点击图表非常缓慢

22

首先介绍背景:我在Windows 10 Pro笔记本电脑上,使用Visual Studio 2015中的基于数据库的EF6模型(最新的nuget 6.1.3指向本地SQL Server 2014 SP1 Express数据库)。我从Windows 8.1和Visual Studio 2013升级过来。大约6个月前,我也将模型从EF5升级到了EF6,但我认为这与问题无关,因为我也尝试过从头开始重建。

模型:大约100个表格、50个视图和250个关联。

问题是每次我想对我的模型进行更改时,单击(左键或右键).edmx图会导致Visual Studio停止响应数分钟。我已经将我能够移动到另一个没有此问题的图表(主要是没有关联的视图)上的所有内容都移动了过去,因此我认为关联数是问题所在。其中大多数是从数据库中获取的必需外键关联。然而,将3个FK关联连接到我的主图表上的视图需要约半个小时的时间。我可以理解模型中存在实体数限制,但我不明白为什么单击图表就会导致Visual Studio停止响应。任务管理器显示CPU使用率高,但没有磁盘使用率。

单击任何实体都没问题,移动或编辑它们也没问题。问题在于单击背景画布。

我已经开始通过模型浏览器从数据库更新模型,但我无法避免使用右键单击图表来创建新关联。

我没在任何地方看到关于这个问题的评论。有什么原因或解决方法建议吗?

顺便说一下,我刚刚重新安装了Windows 10 Pro,并仅安装了SQL Server 2014 SP1 Express和Visual Studio 2105 Pro。所以我的系统上没有任何自定义设置。

更新:当DevEnv.exe停止响应时,ProcDump提供了此堆栈跟踪信息,建议搜索图形对象的本机代码:

[External Code] 
[Managed to Native Transition]  
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.GraphObject.14.0.dll!<Module>.GeoSCursor.search(GeoSCursor* value)
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.GraphObject.14.0.dll!Microsoft.VisualStudio.Modeling.Diagrams.GraphObject.VGGraph.GetObjectsInRect(LRECT bbox, Microsoft.VisualStudio.Modeling.Diagrams.GraphObject.VGLayoutObjectList items, VSGLayoutObject** ignoreItems, int numberItems, int numbertypes, int* types, bool searchSubGraphs)
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.GraphObject.14.0.dll!Microsoft.VisualStudio.Modeling.Diagrams.GraphObject.VGGraph.GetObjectsInRect(LRECT bbox, Microsoft.VisualStudio.Modeling.Diagrams.GraphObject.VGLayoutObjectList items, VSGLayoutObject** ignoreItems, int numberItems, int numbertypes, int* types, bool searchSubGraphs)
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.GraphObject.14.0.dll!Microsoft.VisualStudio.Modeling.Diagrams.GraphObject.VGGraph.get_ObjectsInRectangle(double x0, double y0, double x1, double y1, bool searchSubGraphs)
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.14.0.dll!Microsoft.VisualStudio.Modeling.Diagrams.GraphWrapper.HitTest(Microsoft.VisualStudio.Modeling.Diagrams.RectangleD hitArea, bool requireCompleteContainment, bool searchSubGraphs) 
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.14.0.dll!Microsoft.VisualStudio.Modeling.Diagrams.GraphWrapper.SpatialQuery(Microsoft.VisualStudio.Modeling.Diagrams.GraphWrapper.SpatialDirection direction, Microsoft.VisualStudio.Modeling.Diagrams.ShapeElement currentShape, Microsoft.VisualStudio.Modeling.Diagrams.ShapeElement parentShape)
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.14.0.dll!Microsoft.VisualStudio.Modeling.Diagrams.ShapeElement.FindNextInChildShapes(Microsoft.VisualStudio.Modeling.Diagrams.ShapeElement startFromChildShape, bool focusableRequired)
Microsoft.VisualStudio.Modeling.Sdk.Diagrams.14.0.dll!Microsoft.VisualStudio.Modeling.Diagrams.ShapeAccessibleObject.GetChild(int index)
System.Windows.Forms.dll!System.Windows.Forms.AccessibleObject.GetFocused()
System.Windows.Forms.dll!System.Windows.Forms.AccessibleObject.Accessibility.IAccessible.accFocus.get()
System.Windows.Forms.dll!System.Windows.Forms.InternalAccessibleObject.System.Windows.Forms.UnsafeNativeMethods.IAccessibleInternal.get_accFocus()

更新2:XtraSimplicity提供了一种对某些人有效的解决方案,但对我无效。感谢他的建议,我已经排除了直接图形驱动程序问题。我在笔记本电脑上有英特尔HD Graphics Family和NVIdia GeForce GT 750M显示适配器。Intel是通常的主动适配器,但仅启用NVidia时问题也会出现。我还尝试了在Visual Studio中禁用硬件支持的建议,但这只会使得打开edmx时VS的性能变得更糟。


EF7将删除edmx,因此您现在可以尝试转向基于代码的解决方案。 - jamesSampica
1
使用Code-First从来不是一个维护数据库模型的选项,特别是当只有部分数据库通过EF使用,并且许多与缓存和数据构建相关的内部触发器、视图、函数和存储过程非常复杂时。在这种情况下,使用数据库项目和EF数据库优先更具生产力。虽然完全可以不使用edmx,但我们将在明年的重建中研究EF7,以便更加满意。 - Tree
今天就使用EF6的“EF Reverse POCO”模板! - ErikEJ
7个回答

33

我们在两台安装了Windows 10和触摸屏的笔记本电脑上遇到了相同的问题。结束TabTip.exe进程似乎可以解决这个问题。

来源:https://connect.microsoft.com/VisualStudio/Feedback/Details/2011437

打开任务管理器并结束TabTip.exe(触摸键盘和手写面板)的进程。这样做后,设计器将正常响应。请注意,如果单击或触摸任务栏中的键盘图标,TabTip.exe将重新启动。


这是我实际使用的解决方案,因为我有一台触摸屏笔记本电脑。这可能不是虚拟机的解决方案,所以如果有人找到了那个问题的解决方案,请也发布出来。 - Tree
这对我来说也完全解决了这个问题,杀掉进程后,EDMX 设计器立即开始正常响应。希望很快能通过更新修复这个问题! - SelAromDotNet
这是在戴尔XPS 15 9550上的一个不同的应用程序,但它仍然是与触摸屏键盘相关的应用程序。真是个惊人的发现,而且我个人也不喜欢触摸屏。只是想要4k,所以这两个东西在这台笔记本电脑上是一对。 - Scott Smith
这个问题困扰了我好几个月,但这个解决方案适用于我的HP Envy触摸屏笔记本电脑。他们是如何发现问题的根源超出了我的理解。 - moomoo
可以确认这是完全正确的,Dell XPS 15 9550上的等效物称为TabletInputService,只需在Windows 10的services.msc中停用它即可使EDMX恢复正常!太棒了! - user692942
如果我们正在使用Windows 7和VS 13呢? - Dawood Ahmed

5

我尝试了被接受的答案,它对我有效,但是问题在重新启动后又出现了。我还尝试了其他答案,但没有成功。我找到了有问题的Windows服务并使用Windows 10服务管理屏幕来禁用该服务。我希望这对其他遇到此问题的人有所帮助。


如何完全禁用服务

禁用服务:

  1. 使用Windows开始搜索(通过开始菜单)并键入:Services
  2. 您应该会看到一个名为Services的Windows桌面应用程序(打开它)。
  3. 找到名为“触摸键盘和手写面板服务”的服务。
  4. 右键单击该服务以打开其属性。
  5. 在常规选项卡下,将启动类型设置为“已禁用”。
  6. 如果服务尚未停止,请停止该服务。

验证:

  1. 打开Visual Studio的EDMX,您应该立即注意到差异,如果没有,则可能与我的问题不同。
  2. 重新启动计算机并再次测试EDMX,它不应该变慢。

注意:这会对您的手势和触摸板造成一些影响,因此如果您经常使用它,请勿执行此操作。本指南适用于Windows 10,并对我有效,但可能对您无效。此外,我没有测试Windows更新是否会重新启用该服务。


4

由于我的评论声望还未达到最低要求,因此我无法发表评论,但是我遇到了完全相同的问题。

像你一样,我已经重新安装了Windows 10(企业版)和Visual Studio(包括2013 Pro和2015 Pro),但仍然没有解决问题。

目前,我将这个问题放在后炉,并通过使用DevArt的Entity Developer(https://www.devart.com/entitydeveloper/)和手动编辑类来匹配数据库更改来绕过它。

虽然这很繁琐,也不是很有趣,但对我而言有效(目前为止)。

希望这可以帮助某些人。

编辑:

对于可能在将来遇到这个问题的任何人,以下方法似乎已经解决了我的问题:

  • 导航到 工具 > 选项 > 一般
  • 取消勾选“根据客户端性能自动调整视觉体验”
  • 取消勾选“如果可用,使用图形加速”

虽然您可能不需要,但我保持“启用丰富的客户端视觉体验”未被选中。

如果这不起作用,请查看下面这个答案的评论 - 这可能会有帮助。 :)

来源:http://pinter.org/?p=2611

编辑2:

我的问题又回来了,经过进一步调查,发现它是由Remote Desktop引起的(我目前使用基于ESXi的Windows 10 VM)。切换到VNC或使用VMWare vSphere Web控制台可以使Visual Studio正常运行。希望这能帮助某人! :)


谢谢您提供entitydeveloper的建议,我会去看看。我们现在遇到的问题似乎并不常见,否则应该会有更多类似的问题。我一度怀疑这可能是图形驱动程序的bug,但当它在大量使用CPU时,它似乎没有比平常使用更多内核进程的时间,所以这听起来很可疑。您还记得您在Windows 8上是否遇到过这个问题吗?我不认为我有,在我的同事用相同的edmx且在Windows 7上却完全没有这个问题。 - Tree
我刚刚开始使用SysInternals Process Monitor记录devenv.exe进程,并在Entity Designer(因此也包括Visual Studio)“冻结”期间捕获了超过2,400个IO事件。在同一时间段内,还有192个注册表读/写事件和17个TCP/IP事件。后者最可能是针对SQL Server的(目标端口49154、49155)。 - XtraSimplicity
CPU符合我的预期(2个繁忙的CPU单元)。进程监视器没有显示任何附加到VS的进程在做耗时任务;所有线程打开和关闭都相当迅速。与控件库进行交互在Visual Studio中是有道理的,但不清楚它在这种情况下做了什么。在挂起期间,对主要的VS进程运行ProcDump可能会有所帮助。等我发布当前版本后,我会尝试一下。 - Tree
1
我刚找到了一些可能有用的东西 - 明天早上回到工作时我会试试它们,但我想把它们发布在这里,以防它们可能会帮助你或其他人。这里这里 (或者如果您使用的是MS SQL Server Standard,则可能是这样 - 这是有道理的,因为EF Designer似乎确实与SQL Server通信(根据Process Monitor)) - XtraSimplicity
1
我刚刚在CodePlex上发布了一个错误问题,因为听起来MSDN论坛不再使用。如果你想跟踪我是否在那里得到回复,问题在这里:https://entityframework.codeplex.com/workitem/2861 - Tree
显示剩余11条评论

2

这是与Microsoft.VisualStudio.Modeling.Sdk在Windows 10上相关的问题,也影响到了LINQ to SQL(DBML)设计工具。负责VS Modeling SDK的团队正在处理此问题。我们在EF项目网站https://entityframework.codeplex.com/workitem/2861上跟踪此问题。我们将持续更新该问题的进展情况、修复程序的可用性、解决方法等信息。


0
  • 首先打开位于ProjectName.edmx下的ProjectName.edmx.diagram文件。

  • 现在向下滚动,如果你看到</edmx:Diagrams> un</edmx:Designer> </edmx:Edmx>之后有任何随机代码行,而且这些代码重复出现了数千次以上,那么这就是问题所在。

  • 删除这些代码或者删除数据库并重新创建。


0
如果这对任何人有所帮助。我遇到了同样的问题。当我尝试从数据库生成模型时,需要大约18分钟。 我正在运行EF 6.1.3。 Sql Server 2014管理工具。 VS 2015。 我运行了这个命令,现在它非常快,只需要几秒钟。 “ALTER DATABASE ROW SET COMPATIBILITY_LEVEL = 110” 您需要重新启动SQL服务器服务。

0
如果您已经安装了扩展程序Productivity Power Tools,请在开始使用EntityFramework图表之前禁用它,然后在完成后启用它。我不经常使用EntityFramework图表,所以这对我很有效。

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