MySQL を使用した Entity Framework - モデルの生成中にタイムアウトが経過しました
-
19-09-2019 - |
質問
MySQL でデータベースを構築し、Entity Framework でそれをマッピングしようとしていますが、EF コンテキストに約 20 個を超えるテーブルを追加しようとすると常に「GenerateSSDLException」が発生します。
'microsoft.data.entity.design.visualstudio.modelwizard.engine.modelbuilderengine+generatesslexception'データベースから更新しようとしたときに発生したタイプの例外。例外メッセージは次のとおりです。'コマンド定義の実行中にエラーが発生しました。見る 詳細については、内部の例外です。
コマンドの実行中に致命的なエラーが発生しました。
タイムアウトが経過しました。操作が完了する前にタイムアウト時間が経過したか、サーバーが応答していません。
影響を受けるテーブルについては特別なことは何もなく、同じテーブルになることはありません。特定の (不特定の) 数のテーブルが追加されると、「タイムアウトが切れました」エラーが表示されずにコンテキストを更新できなくなるだけです。テーブルが 1 つだけ残っている場合もあれば、3 つのテーブルが残っている場合もあります。結果はかなり予測不可能です。さらに、エラーが発生する前に追加できるテーブルの数にばらつきがあることから、問題は、既存のテーブル定義と、追加される新しいテーブルの両方を含むコンテキストを更新するために生成されるクエリのサイズにあるのではないかと考えられます。それに追加されています。基本的に、SQL クエリが大きくなりすぎて、何らかの理由で実行に失敗します。
でモデルを生成すると、 EdmGen2 エラーは発生せずに動作しますが、生成された EDMX ファイルを Visual Studio 内で更新すると、前述の例外が発生します。
EdmGen2 が正常に動作することを考えると、おそらくこの問題の原因は Visual Studio 内のツールにありますが、おそらく他の人がこの非常にユニークな問題に対処する方法についてアドバイスを提供してくれることを期待しています。 それを経験しているのは私だけではありません.
同僚が提案した提案の 1 つは、テーブルをクロスオーバーさせて 2 つの別々の EBMX ファイルを維持するというものでしたが、私の意見では、これはかなり見苦しい修正のように思えます。これは「新しい技術」を使おうとすることで得られるものだと思います。:(
解決
私はちょうど全体の午後には、この問題に頭痛を持っていました。 「= 300000デフォルトのコマンドタイムアウト;」しかし、私はあなたのEFのdesinger接続が存在するとして、どこあなただけのapp.configまたはweb.configファイルでステートメントを追加することができます解決策を見つけました。問題はなくなっています。
他のヒント
上記のアドバイスは正しくありません。
Default Command Timeout
変更する必要がある接続文字列パラメータはこれだけです。 Connect Time
そもそも接続を取得するまでの待機時間を調整するだけです。それはあなたの問題ではありません。
Default Command Timeout
Connector/Net 6.3.4 の接続文字列には効果がないようです。これは Connector/Net のバグだと思いますので、 バグレポート オラクルと。 編集:このバグは MySql 開発者によって認識され、2010 年 10 月 13 日に修正されました。修正は 6.0.8、6.1.6、6.2.5、および 6.3.5 に適用されました。
これを回避する唯一の方法は、自分のやり方を変えることでした ObjectContext
オブジェクトの CommandTimeout
プロパティを null 以外の値に設定します。null の場合は、MSDN ごとに「基礎となるプロバイダー」の値を使用することになっています。null でない場合、それはタイムアウトまでの秒数の正式な値です。
例えば:
var context = new CitationData.de_rawEntities();
context.CommandTimeout = 180;
チェックアウト:
ます。http:// efvote。 wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/する
おっと、ちょうどこのリンクは既に投稿されたことに気づきました!申し訳ありません。
私も強く
「同僚が提供する1つの提案は、いくつかのテーブルクロスオーバーと二つの別々のEBMXファイルを維持した」検討しますこれは醜いかもしれないが、それが動作するはずです!
問題の解決方法を簡単に説明しないあなたたちは弱いです。
- すべてのデータ接続を削除します
- 最新の MySql コネクタ (6.3.x) をダウンロードします。
- Visual Studio を開き > サーバー エクスプローラー > [データ接続] を右クリック > 接続の追加
- MySQL データベースプロバイダーの選択
- 接続の詳細を入力します
- 「進む」をクリックします
- 接続タイムアウトを見つけて、30,000 程度にします。
- デフォルトのコマンドタイムアウトを見つけて、30,000 程度にします。
すべてを保存してから、EF モデルを再度更新してみてください。これをEF 4.0とVs2010でテストしたので、機能することがわかりました。
私は無駄に上記溶液の全てを試してみました。私は、MySQLの最新の.NETコネクタ(6.3.6)をダウンロードし、問題が消えます。
<のhref = "HTTPでのMySQL のキ繝ァ繝ヨをお試しください:// WWW。 devart.com/entitydeveloper/」のrel = "nofollowをnoreferrer">エンティティ開発する。
当社は、当社のツールでモデル生成過程でいくつかの改善を行いました。あなたは、ADO.NET Entity Frameworkのモデルに似ていますが、いくつかの改善があり、タイムアウト問題を持っていないプロジェクトにDevartエンティティモデルを追加することができます。
2つの可能性を念頭に春ます:
まず、それが(.NET 3.5 SP 1に同梱)EFバージョン1であることです。 このとこのを。
他のは、これはおおよそ1は、コールの間違った種類を使用した(1991年頃)SQL Serverと前ODBCドライバとなった同じ症状のように感じているということである:1種類のクエリが結果に(select
)を返すと一緒に使用されており、以下のための他の文-ない結果(create table
)を返します。最終的な接続は、対応するクエリにSELECT結果を一致しようと絶望的に非同期になりました。 (当時は、のブルースクリーンがが存在しませんでした:。コンピュータではなく、自主的に再起動する傾向にあった)。
のだろうか。これが原因である場合、一連の操作について「より純粋な」であることによって回避される可能性があります。完全なテーブルが、何も別の-その後1を作成しないでくださいされており、その後、新しいを追加するalter table
それがテーブルを作成させるような何もしません列ます。