命令执行时实体框架定期出错

时间:2011-03-22 15:46:23

标签: entity-framework linq-to-entities

我正在使用Entity Framework开发WPF应用程序以进行数据访问。作为设计模式,我使用“MVVM”进行层组织,将“Repository”与“UnitOfWork”用于数据层组织。

通用存储库类:



    public class EFRepository : IRepository where T : class
    {
    public IUnitOfWork UnitOfWork { get; set; }
    private IObjectSet _objectset;
    private IObjectSet ObjectSet
    {
        get
        {
            if (_objectset == null)
                    {
                        _objectset = UnitOfWork.Context.CreateObjectSet();
            }
            return _objectset;
        }
    }
    public virtual IQueryable All()
    {
        return ObjectSet.AsQueryable();
    }
    ...

工作单元界面:



    public interface IUnitOfWork: IDisposable
        {
            ObjectContext Context { get; set; }
            void Save();
            bool LazyLoadingEnabled { get; set; } 
            bool ProxyCreationEnabled { get; set; }
            string ConnectionString { get; set; }
        }

我在模型层构建所有L2E查询,如:

this.repository1.All().First(i => i.Field1 == some_value);

有时这里会抛出一个EntityCommandExecutionException。它有时会发生,但不是常规的。没有规则可以发生此异常。

例外细节:

this.repository1.All().First(i => i.Field1 == some_value);

请帮我找出问题,我真的不知道该怎么办=(

P.S:
我试图在简单的控制台应用程序中引发此错误构建和执行L2E查询。我尝试了单个L2E查询并通过1000次迭代循环。但没有什么能引起这种例外

如果需要,我可以发布任何其他信息。

[23.03.2011]

其他信息:

  • Entity Framework 4.0
  • MSSQL Server 2008
  • 每次查询发生时都会抛出此异常。它可以是对小表(< 200行)或大(> 500k行)的l2e查询。此异常也可能由函数导入调用
  • 引起
  • 抛出此异常时


    EntityCommandExecutionException: 
    {"An error occurred while executing the command definition. See the inner exception for details."}
    InnerException:
     {"Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding."}
    StackTrace:
        at 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(Nullable`1 forMergeOption)
       at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()
       at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)
       at System.Data.Objects.ELinq.ObjectQueryProvider.b__0[TResult](IEnumerable`1 sequence)
       at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
       at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
       at System.Linq.Queryable.First[TSource](IQueryable`1 source, Expression`1 predicate)
    

立即抛出,但连接超时设置为30秒! (我认为这是“关键特征”)

  • 数据库服务器位于局域网中,数据库没有繁重的流量。
  • 正如我所知,无论使用何种查询或表格,都可以随时发生此异常。
  • 我不使用交易。即使我只使用选择查询,也会发生此错误。

我认为将WPF与EF一起使用会导致问题,因为我的“EF部分”在控制台应用程序中运行良好。

1 个答案:

答案 0 :(得分:0)

ObjectContext有两个超时参数:

int x = myObjectContext.Connection.ConnectionTimeout;

int? x = myObjectContext.CommandTimeout;

查看异常和callstack我不认为ConnectionTimeout是问题(这是尝试建立从客户端到SQL Server的连接的最长时间)。您可以尝试将CommandTimeout设置为某个较高的值(即查询的超时和使用SaveChanges的提交;值null表示将采用基础提供程序的默认值)。