我的 EF 4.3.1 模型有 200 多个表。初始启动很糟糕,几分钟。DotTrace 捕获的配置文件暗示了框架深处的一些糟糕的算法/可扩展性选择,这可以从那里对许多方法的数百万次调用和 3600 万次 IEnumerable.Contains() 调用证明。这是一个片段,这都是由在数据库上完成的第一个查询触发的(未来的查询不会这样做并且很好)。
我可以对我的模型做些什么来减轻这种痛苦?我可以以某种方式预编译它吗?更好的是,EF 团队能否解决这些问题或开源框架以便我可以?或者至少修复Warapper
? :)
编辑:触发此事件的一个特定 EF 调用基本上是var db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();
. EF Migrations Seed() AddOrUpdate 也有效地生成相同的堆栈。更完整的堆栈跟踪,可能会提供更多上下文,在这里:Fuller Stack Trace
编辑:一些相关链接:
- MSDN:性能注意事项(实体框架)(感谢@AakashM)
- MSDN:英孚电动工具
- SO:用于大量表的实体框架 4.1 (715)
EDIT2:现在他们刚刚开源了代码,看来这一行:
//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