0

这是背景:我构建了一个新的 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(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.DbQuery1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() at RepeatBillingService.Repositories.BillingRepository.GetMembersForGame(String game, List1& 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(对象实例,对象 [] 输入,对象 [] 和输出)

4

1 回答 1

1

我明白了这一点,并道歉,因为整个问题有点牵强。我在后台打开了一个 SSMS 会话,我正在调整数据以进行测试,并且一直在更新“NextChargeDate”值。当我来关闭会话时,我得到“有未提交的事务,你现在要提交吗”这开始敲响警钟。

果然重启WCF服务,一切正常。所以我的超时是由于数据库中该字段上的未提交更新而发生的 - EF 显然在提交更新之前无法成功读取数据。

因此,对于在这个问题上浪费您的时间,我深表歉意,这只是一个简单的疏忽,同时在压力下长时间工作以启动新系统。

无论如何感谢您的回复。

于 2012-10-15T17:01:03.193 回答