Исключение из непредвиденного состояния соединения

После трех часов отладки и поиска я надеюсь, что у кого-то есть ответ. Entity Framework (используя MySQL) выдает следующее исключение, если я быстро вызываю следующую функцию (например, на 0,1 с.).

System.InvalidOperationException: непредвиденное состояние соединения. При использовании поставщика упаковки убедитесь, что событие StateChange реализовано на обернутом DbConnection.

Однако иногда функция работает без проблем. Исключение вызывается при первом вызове ToList():

void InsertOrUpdateMaterials(List<Material> materials)
{
    var id = GetUserId();
    var materialIds = materials.Select(x => x.MaterialId).ToList();

    // Remove old materials from DB
    var oldMaterials = Db.Materials.Where(p => p.CreatedBy == id && 
            materialIds.Contains(p.MaterialId)).ToList(); // exception
    Db.Materials.RemoveRange(oldMaterials);
    Db.SaveChanges();

    // Replace previous materials with the new ones in list
    Db.Materials.AddRange(materials);
    Db.SaveChanges();
}

Как ни странно, эта ошибка никогда не возникала на сервере разработки, поэтому я смотрел на возможные проблемы с конфигурацией безрезультатно.

Иногда, Entity Framework бросает:

System.Data.Entity.Core.EntityCommandExecutionException: уже открыт DataReader, связанный с этим соединением, который должен быть закрыт первым.

Снова указывая на вызов ToList(). Любые идеи?

Ответ 1

Для других людей, которые могут иметь сходную проблему. Основываясь на приведенных выше комментариях, кажется, что в коде используется кэшированный db-контекст. После создания db-контекста db-соединение сломалось (в приложении не было обработчика StateChange). После разрыва соединения приложение использовало кэшированный db-context для выполнения некоторых операций над ним.

Создание нового db-контекста решило проблему.

Ответ 2

У меня была проблема с Effort.EF6 1.3.0. Исправление для меня состояло в том, чтобы обновить зависимость NMemory от 1.1.0 до 1.1.2.

Ответ 3

У меня была та же проблема с использованием Effort.EF6, но обновление NMemory (как предлагалось user326608) не помогло. Выключается XUnit выполняет тесты параллельно по умолчанию с V2.

Отключение этого поведения исправило это для меня. Добавьте в AssemblyInfo.cs следующее:

using Xunit;
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly)]

Хотя я рассматриваю это как обходной путь, поскольку модульные тесты должны быть независимыми друг от друга.