2011-07-10 22 views
0

現在、Entity Framework 4.1(コードファースト)とSQL Server CE 4.0を使用するアプリケーションで作業しています。 SQL Server CE 4.0から本当に好きな新しいものの1つは、計算された値です。Entity Framework 4.1 DatabaseGeneratedOption.Identityパフォーマンス

しかし、古いデータを新しいデータストアシステム(約50000エントリ)にインポートする際に、パフォーマンスに問題があります。これは私の2番目の実装です。最初のバージョンでは、Entity Framework 4.0とSQL Server CE 3.5が使用されていました。しかし、これらの実装には大きなパフォーマンス差があります。コードの最初の実装では、エントリをインポートするのに約1時間かかりますが、他の実装では数分しかかかりません。

SaveChangesメソッドで最も多くの時間が費やされます。私は問題を[DatabaseGenerated(DatabaseGeneratedOption.Identity)]属性まで追跡しました。 [DatabaseGenerated(DatabaseGeneratedOption.None)]を使用して、自分の世代の鍵を実装すると(単純な回避策として)、最初の実装のレベルでパフォーマンスが戻ります。

これは既知の問題ですか?このパフォーマンスの問題を解決する方法はありますか?それとも自分の鍵を生成する方法がありますか?

+0

EF 4.1のバルク挿入に関する2つの質問/回答があります:http://stackoverflow.com/questions/5943394/why-is-inserting-entities-in-ef-4-1-so-slow-compared- to-objectcontext/5943699#5943699およびhttp://stackoverflow.com/questions/5940225/fastest-way-of-inserting-inentity-framework/5942176#5942176キーは、主に自動変更検出を無効にすることです。私は 'DatabaseGeneratedOption'との関係を見ていませんが、とにかく助けてください。 – Slauma

+0

AutoDetectChangesEnabledを無効にしても、私の場合はパフォーマンスは向上しません(しかし、私はそれを行います)。 DatabaseGeneratedOption.Identityを使用しない場合のスピードアップはずっと高いです。 – Fox32

答えて

0

回避策として「自分の鍵を生成する」方法を選択することにしました。 DBContextクラスにキー生成に必要な機能を追加しました。

Microsoftがこの動作で何かを変更すると、自動生成に戻ります。

0

アプリのライフタイムのためにObjectContext /接続を開いたままにしておきます。 EFは一括挿入には適していませんが、max perfのためにSqlCeResultSetを使用してください。

+0

私はすでにインポートプロセス全体に対してDBContextを開いたままにしていますが、500エントリの小さな単位でコミットするほうが速いようです。問題は、最初のバージョンが自分のニーズに十分に速かったことです。 – Fox32

関連する問題