Обычная ошибка Enity Framework при выполнении команды - PullRequest
1 голос
/ 22 марта 2011

Я разрабатываю приложение 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" прекрасно работает в консольном приложении.

1 Ответ

0 голосов
/ 23 марта 2011

ObjectContext имеет два параметра времени ожидания:

int x = myObjectContext.Connection.ConnectionTimeout;

и

int? x = myObjectContext.CommandTimeout;

Глядя на исключение и стек вызовов, я не думаю, что проблема ConnectionTimeout (это максимальное время для попытки установить соединение между клиентом и SQL Server). Вы можете попытаться установить для CommandTimeout какое-то высокое значение (это время ожидания для запросов и фиксаций с помощью SaveChanges; значение null означает, что будет выбран базовый поставщик по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...