私のEF4.3.1モデルには200個の奇数のテーブルがあります。最初の起動はひどいです、数分。DotTraceでキャプチャされたプロファイルは、フレームワークの奥深くにあるいくつかのひどいアルゴリズム/スケーラビリティの選択を意味します。これは、そこにある多数のメソッドへの数百万の呼び出しと3,600万のIEnumerable.Contains()呼び出しによって証明されています。これがスニペットです。これはすべて、データベースで実行された最初のクエリによってトリガーされます(将来のクエリはこれを実行せず、問題ありません)。
これを痛みを和らげるために、モデルに何ができますか?どういうわけかこれをプリコンパイルできますか?より良いことに、EFチームはこれらの問題に対処するか、フレームワークをオープンソース化してください。または、少なくともWarapper
?のスペルを修正します。:)
編集:これをトリガーする1つの特定のEF呼び出しは基本的にvar db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();
です。また、EF Migrations Seed()AddOrUpdateは、実質的に同じスタックを生成します。より完全なスタックトレースは、もう少しコンテキストを与える可能性がありますが、ここにあります:より完全なスタックトレース
編集:いくつかの関連リンク:
- MSDN:パフォーマンスに関する考慮事項(エンティティフレームワーク)(@ AakashMに感謝)
- MSDN:EFパワーツール
- SO:多数のテーブル用のEntity Framework 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