【问题标题】:Entity Framework edmx click on diagram very slow实体框架edmx点击图很慢
【发布时间】:2016-02-24 14:31:10
【问题描述】:

背景优先:我在 Windows 10 Pro 笔记本电脑上的 Visual Studio 2015(最新的 nuget 6.1.3 指向本地 SQL Server 2014 SP1 Express 数据库)中有一个数据库优先的 EF6 模型。在我从 Windows 8.1 和 Visual Studio 2013 升级之后。我也在大约 6 个月前从 EF5 升级了模型,但我认为这无关紧要,因为我也尝试过从头开始重建。

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

问题是每次我想更改我的模型时,.edmx 图表上的任何类型的单击(左或右)都会导致 Visual Studio 在几分钟内变得无响应。我已经把我能做的一切都移到了另一个没有这个问题的图表上(大多数是没有关联的视图),所以我假设关联的数量是问题所在。其中大部分是从数据库中提取的所需外键关联。然而,连接 3 个 FK 关联以查看我的主图需要大约半小时。我可以理解模型中的实体是否存在限制,但我不明白为什么只需单击图表就会使 Visual Studio 变得无响应。任务管理器显示 CPU 使用率很高,并且没有磁盘使用。

单击任何实体都可以,移动它们或编辑它们也是如此。问题在于点击背景画布。

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

我在任何地方都没有看到任何关于这个问题的 cmets。任何原因或解决方法的建议?

顺便说一句,我刚刚重新安装了 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()

UPDATE2:XtraSimplicity 有一个适用于某些人的解决方案,但不适用于我。感谢他的建议,我已将其排除为直接图形驱动程序问题。我的笔记本电脑中有英特尔高清显卡系列和 NVIdia GeForce GT 750M 显示适配器。英特尔是常用的主动适配器,但仅启用 NVidia 时也会出现问题。我也尝试过在 Visual Studio 中禁用硬件支持的建议,但如果有任何东西只会在打开 edmx 时使 VS 的性能更差。

【问题讨论】:

  • EF7 将删除 edmx,因此您现在可以尝试使用代码优先解决方案。
  • 当只有部分数据库通过 EF 以及许多与缓存和数据相关的内部触发器、视图、函数和存储过程使用时,使用代码优先从来都不是维护数据库模型的真正选择建筑相当复杂。在这种情况下,数据库项目和使用 EF 数据库优先的效率更高。不过不使用 edmx 完全高兴,因此我们明年将研究 EF7 进行重建。
  • 今天在 EF6 中使用“EF Reverse POCO”模板!

标签: entity-framework visual-studio-2015 entity-framework-6 edmx


【解决方案1】:

我无法发表评论,因为我的评论声誉低于最低标准,但我遇到了完全相同的问题。

和你一样,我重新安装了 Windows 10(企业版)和 Visual Studio(2013 Pro 和 2015 Pro)都无济于事。

目前,我已将其放在次要位置,并正在通过结合使用 DevArt 的实体开发人员 (https://www.devart.com/entitydeveloper/) 并手动编辑类以匹配数据库更改来解决它。

这很乏味,也不是很有趣 - 但它对我有用(目前)。

希望这对某人有所帮助。

编辑:

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

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

尽管您可能不必这样做,但我没有勾选“启用丰富的客户端视觉体验”。

如果这不起作用,请查看此答案下方的 cmets - 它可能有用。 :)

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

编辑 2:

我的问题又回来了,经过进一步调查,它似乎是由远程桌面引起的(我目前使用的是 ESXi 托管的 Windows 10 虚拟机)。切换到 VNC 或使用 VMWare VSphere Web 控制台会导致 Visual Studio 运行得非常好。希望这可以帮助某人! :)

【讨论】:

  • 感谢entitydeveloper的建议,我去看看。我们遇到的问题似乎并不常见,否则会有更多这样的问题。我想知道这是否可能是一个图形驱动程序错误,但是当它大量使用 CPU 时,它看起来并没有比平时花费更多的时间用于内核进程,所以这听起来令人怀疑。你还记得你是否在 Windows 8 上遇到过这个问题吗?我想我没有,我在 Windows 7 上使用相同 edmx 的同事根本没有这个问题。
  • 我在使用 Windows 8 时从未遇到过这个问题,没有。有趣的是,我的 CPU 使用率并没有增加超过 40%,而且我只剩下超过 4GB 的 RAM - 所以在我的设置中,这看起来不像是资源问题。
  • 我刚刚开始使用 SysInternals Process Monitor 记录 devenv.exe 进程,并在实体设计器(以及因此,Visual Studio)被“冻结”期间捕获了超过 2,400 个 IO 事件。在同一时期,还有 192 个注册表读/写事件和 17 个 TCP/IP 事件。后者最有可能是 SQL Server(目标端口 49154、49155)。
  • 我刚刚发现了一些可能会有所帮助的东西 - 我明天早上回来工作时会尝试一下,但我认为值得将它们发布在这里以防万一可以帮助您或其他人。 herehere(或者可能是 MS SQL Server Standard,如果您正在使用它 - 这可能是有道理的,因为 EF 设计器似乎确实与 SQL Server 通信(根据 Process Monitor))跨度>
  • 我刚刚在 CodePlex 上提出了一个错误问题,因为听起来 MSDN 论坛不再使用了。如果您想在我收到回复时关注,问题就在这里:entityframework.codeplex.com/workitem/2861
【解决方案2】:

这是 Windows 10 上的 Microsoft.VisualStudio.Modeling.Sdk 的问题,也会影响 LINQ to SQL (DBML) 设计器。拥有 VS 建模 SDK 的团队目前正在研究此问题。我们在 EF 项目站点 https://entityframework.codeplex.com/workitem/2861 上跟踪它时遇到问题。我们会及时更新该问题的进展、修复的可用性、解决方法等。

【讨论】:

    【解决方案3】:

    我们在 2 台装有 Windows 10 和触摸屏的笔记本电脑上遇到了同样的问题。终止进程 TabTip.exe 似乎可以解决问题。

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

    TabTip.exe(触摸键盘和手写面板)上的任务管理器和结束进程。这样做之后,设计师会做出很好的反应。请注意,如果您单击或触摸任务栏中的键盘图标,TabTip.exe 将重新启动。

    【讨论】:

    • 这是真正适合我的解决方案,因为我有一台触摸屏笔记本电脑。这可能不是虚拟机的解决方案,所以如果有人找到该问题的解决方案,请也发布。
    • 这也彻底解决了我的问题,EDMX设计者杀死进程后立即开始正常响应。希望这个问题很快在更新中得到修复!
    • 这是戴尔 XPS 15 9550 上的不同应用程序,但它仍然是与触摸屏键盘相关的应用程序。惊人的发现,无论如何我个人讨厌触摸屏。只想要 4k,所以这台笔记本电脑上两个成对出现。
    • 这几个月来一直困扰着我,但这个修复在 HP Envy 触摸屏笔记本电脑上对我有用。他们是如何发现源头的,我不知道。
    • 可以确认这是物超所值的,相当于戴尔 XPS 15 9550 @ScottSmith 被称为 TabletInputService 刚刚停止它并在 Windows 10 上的 services.msc 中禁用它,EDMX 就开始使用了!很棒的发现!
    【解决方案4】:

    我尝试了接受的答案,它确实对我有用,但是在重新启动时问题又回来了。我也尝试了其他答案,但没有成功。我发现了有问题的 windows service 并使用 Windows 10 服务管理屏幕禁用了该服务。我希望这对解决此问题的其他人有所帮助。


    如何完全禁用服务

    禁用服务:

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

    验证:

    1. 打开 Visual Studio 的 EDMX,您应该会立即注意到差异,如果没有,那么您可能不会遇到和我一样的问题。
    2. 重新启动计算机并再次测试 EDMX,应该不会很慢。

    注意:这确实会影响您的手势和触摸板,所以如果您经常使用它,请不要这样做。本指南适用于 Windows 10,对我有用,但可能不适合您。此外,我还没有测试 Windows 更新是否会重新启用该服务。

    【讨论】:

      【解决方案5】:

      如果您安装了扩展生产力工具,请在开始使用实体框架图之前禁用它,然后在完成后禁用它。我不经常进入我的实体框架图,所以这对我有用。

      【讨论】:

        猜你喜欢
        • 2014-12-13
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        相关资源
        最近更新 更多