【发布时间】:2012-06-01 04:33:25
【问题描述】:
我的 EF 4.3.1 模型有 200 多个表。初始启动很糟糕,几分钟。 DotTrace 捕获的配置文件暗示了框架深处的一些糟糕的算法/可扩展性选择,这可以从那里对许多方法的数百万次调用和 3600 万次 IEnumerable.Contains() 调用证明。这是一个 sn-p,这一切都是由对数据库执行的第一个查询触发的(未来的查询不会这样做并且很好)。
我可以对我的模型做些什么来减轻这种痛苦?我可以以某种方式预编译它吗?更好的是,EF 团队能否解决这些问题或开源框架以便我可以?或者至少修复Warapper 的拼写? :)
编辑:触发此事件的一个特定 EF 调用基本上是 var db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();。 EF Migrations Seed() AddOrUpdate 也有效地生成相同的堆栈。更完整的堆栈跟踪(可能会提供更多上下文)在这里:Fuller Stack Trace
编辑:一些相关链接:
- MSDN:Performance Considerations (Entity Framework)(感谢 @AakashM)
- MSDN:EF Power Tools
- 所以:Entity Framework 4.1 for large number of tables (715)
EDIT2:现在他们只是open sourced的代码,看来这一行:
//Filter the 1:1 foreign key associations to the ones relating the sets used in these cell wrappers.
oneToOneForeignKeyAssociationsForThisWrapper =
oneToOneForeignKeyAssociationsForThisWrapper.Where(
it => (it.AssociationEndMembers.All(endMember => entityTypes.Contains(endMember.GetEntityType()))));
是需要一些工作的人。它可能不需要使用 O(n^2) 算法,但我还没有仔细观察。
EDIT3:令人高兴的是,EF6 中的工作似乎正在修复此代码:http://entityframework.codeplex.com/discussions/396130
【问题讨论】:
-
您能
porovide创建此跟踪的 c# 示例代码吗? -
@Erik Philips:当然(编辑过的问题),但这很简单。
-
第一个停靠港应该是Performance Considerations (Entity Framework),如果你还没有去过那里 - 检查版本号顺便说一句
-
@AakashM:谢谢。我看了,好好读。至少他们知道这很慢。 ;)
-
在这个问题中:stackoverflow.com/q/18807355/325727 我遇到了类似的问题,UnityIoC 导致了数百万个框架调用,如 DotNetTrace 所示。不幸的是,这从未解决,我们最终放弃了 Unity。
标签: c# performance entity-framework-4 entity-framework-4.3