这是背景:我构建了一个新的 WCF 服务,它使用 EF5 并针对 .Net Framework 4.5。我对现有的大型遗留数据库使用了代码优先。在我将服务部署到测试服务器之前,一切都运行良好,当时我发现测试服务器(因此生产服务器,因为它们是相同的构建)无法支持 Framework 4.5。
因此,我将项目降级为针对 Framework 4.0。在重新编码我所有的实体映射后(以避免使用特定于 4.5 的 DataAnnotations.Schema 命名空间中的代码),我让这个在本地再次工作。但是,在部署到服务器后,我遇到了此处描述的错误:任何人都可以发现为什么我在测试 EF 5 beta 时不断收到此错误。
按照建议进行操作后 - 通过 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 行为) 在 System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 在 System.Data.Objects.ObjectQuery 1.GetResults(Nullable
1 forMergeOption)在 System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Data.Entity.Internal.Linq.InternalQuery
1.GetEnumerator() 在 System.Data.Entity.Infrastructure.DbQuery1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator()
at RepeatBillingService.Repositories.BillingRepository.GetMembersForGame(String game, List
1& billingQ) 在 p:\Projects\BigFatLottos\RepeatBillingService\RepeatBillingService\Repositories\BillingRepository.cs:第 441 行,位于 p:\Projects\BigFatLottos\RepeatBillingService\RepeatBillingService\Repositories\BillingRepository.cs 中 RepeatBillingService.Repositories.BillingRepository.GetMemberGamesForBilling() :RepeatBillingService.RepeatBillingService.RunRepeatBilling() 中的第 24 行在 p:\Projects\BigFatLottos\RepeatBillingService\RepeatBillingService\RepeatBillingService.svc.cs:第 51 行在 System.ServiceModel.Dispatcher 的 SyncInvokeRunRepeatBilling(Object , Object[] , Object[] ) System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 处的 .SyncMethodInvoker.Invoke(对象实例,对象 [] 输入,对象 [] 和输出)