Я разрабатываю приложение WPF с использованием Entity Framework для доступа к данным. В качестве шаблона проектирования я использую «MVVM» для организации уровня и «Репозиторий» с «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 на уровне модели, например:
<code>this.repository1.All().First(i => i.Field1 == some_value);
Иногда здесь выдается исключение EntityCommandExecutionException. Это бывает иногда, но не регулярно. Нет правила, чтобы это исключение возникало.
Деталь исключения:
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)
Пожалуйста, помогите мне выяснить проблему, я действительно не знаю, что делать сейчас = (
p.s .:
Я попытался спровоцировать эту ошибку при построении и выполнении запросов L2E в простом консольном приложении. Я пробовал одиночные запросы L2E и 1000 циклов итераций. Но ничто не вызвало это исключение.
Я могу опубликовать любую дополнительную информацию, если это необходимо.
[23.03.2011]
Дополнительная информация:
- Entity Framework 4.0
- MSSQL Server 2008
- это исключение может быть выдано в любое время при выполнении запроса. Это может быть простой запрос к маленькой таблице (<200 строк) или большой (> 500 000 строк). Также это исключение может быть вызвано вызовом импорта функций
- когда выдается это исключение,
{"Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."}
он выбрасывается немедленно, но время ожидания соединения установлено на 30 секунд! (я думаю, что это «ключевая особенность»)
- Сервер БД находится в локальной сети, и на БД нет большого трафика.
- Как я выяснил, это исключение может произойти в любое время, независимо от того, какие типы запросов или таблиц используются.
- Я не использую транзакцию. Эта ошибка возникает, даже если я использую только запросы select.
Я думаю, что проблема вызвана использованием WPF с EF, потому что моя "часть EF" прекрасно работает в консольном приложении.