0

背景は次のとおりです。EF5を使用し、.NetFramework4.5を対象とした新しいWCFサービスを構築しました。私は既存の大規模なレガシーデータベースに対してコードファーストを使用しました。テストサーバー(したがって、同じビルドであるため本番サーバー)がFramework 4.5をサポートできないことを発見したときに、サービスをテストサーバーにデプロイするようになるまで、すべてがうまく機能していました。

そこで、Framework4.0をターゲットにするようにプロジェクトをダウングレードしました。すべてのエンティティマッピングを再コーディングした後(4.5に固有のDataAnnotations.Schema名前空間のコードを使用しないようにするため)、これをローカルで再び機能させました。ただし、サーバーにデプロイした後、ここで説明するエラーが発生しました。EF5ベータ版のテストでこのエラーが発生し続ける理由を誰かが見つけられますか

提案どおりに実行した後(NuGetを介してEF5をアンインストールして再インストールした後)、サービスをテストしようとするとタイムアウトエラーが発生します。

具体的には、次のLinqを実行しようとするとタイムアウトが発生します。

var games = from m in _db.Members
        join s in _db.UkSyndicates
            on m.MemberId equals s.MemberId
        where m.PaymentMethod == "Credit/Debit Card"
        && EntityFunctions.TruncateTime(s.NextChargeDate) <=  EntityFunctions.TruncateTime(DateTime.Now)
        && !string.IsNullOrEmpty(m.AibCustomerReference)
        && (m.StatusId == 105 || m.StatusId == 113)
        select new BillingItem
        {
            Id = s.Id,
            SyndicateId = s.SyndicateId,
            MemberId = s.MemberId,
            LastDrawId = s.LastDrawId,
            LastPaidGame = s.LastPaidGame,
            NextChargeDate = s.NextChargeDate,
            Protected = s.Protected,
            PaymentFrequency = (int)(s.PaymentFrequency*4),
            CurrencyCode = m.CurrencyCode,
            AibCustomerReference = m.AibCustomerReference,
            WeeklyFee = (from f in _db.GameFees where f.FeeName == "UK_LOTTO_FEE" && f.CurrencyCode == m.CurrencyCode select f.Amount).FirstOrDefault(),
            GameCode = game,
            PostCode = m.PostCode,
            CountryCode = m.CountryCode,
            EmailAddress = m.Email
        };

このクエリを作成するためのより効率的な方法があるかもしれません-私はLinqとEFにかなり不慣れですが、EFのアンインストールと再インストールの前にこれがタイムアウトしなかったことを強調します。実際、データはかなり迅速に返されました。

EFの再インストール後にこれがタイムアウトする理由はわかりません。コードには何も変更されていませんが、これに対する解決策が必要です。

ありがとう。

発生しているエラーを明確にするために、EFが上記のクエリを実行しようとした時点で、EntityCommandExecutionExceptionがスローされます。例外メッセージは、「コマンド定義の実行中にエラーが発生しました。詳細については、内部例外を参照してください。」です。内部例外は、「タイムアウトが期限切れです。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。」です。

スタックトレースは次のとおりです。

System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand、CommandBehavior Behavior)at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute [TResultType](ObjectContext context、ObjectParameterCollection parameterValues)at System.Data.Objects.ObjectQuery 1.GetResults(Nullable1 forMergeOption) System.Data.Objects.ObjectQueryで1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery1.GetEnumerator()でSystem.Data.Entity.Infrastructure.DbQueryで1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() at RepeatBillingService.Repositories.BillingRepository.GetMembersForGame(String game, List1&billingQ)in p:\ Projects \ BigFatLottos \ RepeatBillingService \ RepeatBillingService \ Repositories \ BillingRepository.cs:line 441 at RepeatBillingService.Repositories.BillingRepository.GetMemberGamesForBilling()in p:\ Projects \ BigFatLottos \ Repeat :p:\ Projects \ BigFatLottos \ RepeatBillingService \ RepeatBillingService \ RepeatBillingService.svc.cs:Line 51 at SyncInvokeRunRepeatBilling(Object、Object []、Object [])のRepeatBillingService.RepeatBillingService.RunRepeatBilling()の24行目System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&rpc)の.SyncMethodInvoker.Invoke(Object instance、Object [] input、Object []&outputs)

4

1 に答える 1

1

私はこれの底に到達しました、そして全体の質問が少し赤いニシンだったので謝罪します。テスト用にデータを微調整しているバックグラウンドでSSMSセッションを開いていて、「NextChargeDate」値を更新していました。セッションを終了すると、「コミットされていないトランザクションがあります。今すぐコミットしますか」というメッセージが鳴り始めました。

案の定、WCFサービスを再起動すると、すべてが完全に機能しました。そのため、DBのそのフィールドでコミットされていない更新が原因でタイムアウトが発生していました。更新がコミットされるまで、EFは明らかにデータを正常に読み取ることができませんでした。

ですから、この質問で時間を無駄にしてしまったことをお詫びします。新しいシステムを稼働させるためにプレッシャーの下で長時間働いている間の単純な見落としです。

とにかくあなたの応答をありがとう。

于 2012-10-15T17:01:03.193 に答える