我正在使用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]
其他信息:
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部分”在控制台应用程序中运行良好。
答案 0 :(得分:0)
ObjectContext
有两个超时参数:
int x = myObjectContext.Connection.ConnectionTimeout;
和
int? x = myObjectContext.CommandTimeout;
查看异常和callstack我不认为ConnectionTimeout
是问题(这是尝试建立从客户端到SQL Server的连接的最长时间)。您可以尝试将CommandTimeout
设置为某个较高的值(即查询的超时和使用SaveChanges
的提交;值null
表示将采用基础提供程序的默认值)。