以下是背景:我构建了一个使用EF5的新WCF服务,目标是.Net Framework 4.5。我已经使用代码优先于现有的大型遗留数据库。所有这些工作都很顺利,直到我将服务部署到测试服务器,当我发现测试服务器(因此生产服务器,因为它们是相同的构建)不能支持Framework 4.5时。
因此,我将该项目降级为目标框架4.0。重新编码我的所有实体映射(为了避免使用特定于4.5的DataAnnotations.Schema命名空间中的代码),我在本地再次使用它。但是,在部署到服务器后,我遇到了此处描述的错误:Can anyone spot why I keep getting this error testing the 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 。异常消息是“执行命令定义时发生错误。有关详细信息,请参阅内部异常。”内部异常是“超时已过期。在操作完成之前已经过了超时时间,或者服务器没有响应。”
堆栈跟踪如下:
at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior behavior)
at 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.DbQuery 1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator()
at RepeatBillingService.Repositories.BillingRepository.GetMembersForGame(String game, List
1&amp; billingQ)在p:\ Projects \ BigFatLottos \ RepeatBillingService \ RepeatBillingService \ Repositories \ BillingRepository.cs:第441行
位于p:\ Projects \ BigFatLottos \ RepeatBillingService \ RepeatBillingService \ Repositories \ BillingRepository.cs中的RepeatBillingService.Repositories.BillingRepository.GetMemberGamesForBilling():第24行
在p:\ Projects \ BigFatLottos \ RepeatBillingService \ RepeatBillingService \ RepeatBillingService.svc.cs中的RepeatBillingService.RepeatBillingService.RunRepeatBilling():第51行
在SyncInvokeRunRepeatBilling(Object,Object [],Object [])
在System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例,对象[]输入,对象[]和输出)
在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
答案 0 :(得分:1)
我深究这一点,并道歉,因为整个问题有点像红鲱鱼。我在后台打开了一个SSMS会话,我在调整数据进行测试,并且一直在更新“NextChargeDate”值。当我关闭会话时,我得到“有未提交的交易,你现在想要提交”,这开始响起警钟。
在重启WCF服务的时候,一切都运转良好。所以我的超时发生是因为数据库中该字段的未提交更新 - 在提交更新之前,EF显然无法成功读取数据。
所以我很抱歉浪费你的时间来处理这个问题,只是在一个简单的监督下,长时间在压力下工作以获得一个新的系统。
非常感谢您的回复。