Наша команда разрабатывает приложение ASP.NET Core MVC с использованием Entity Framework 6 и базы данных Oracle.Из-за Oracle DB мы используем полную Entity Framework вместо EF Core (Oracle еще не выпустил Core EF провайдера) и запускаем наш проект .NET Core внутри полной .NET.Мы используем подход «Сначала база данных» и генерируем нашу локальную модель БД из схемы БД, и обновляем ее снова при любом изменении БД.
Таким образом, мы использовали EF в основном счастливо в течение всего проекта.
Недавно мы были вынуждены перейти на новый сервер БД.Он работает с точно такой же схемой, версией БД, ОС и всем остальным, но мы заметили некоторые странные проблемы с запуском операторов SELECT, которые хорошо работали для нас в прошлом.
Например, скажем, EF генерирует следующий запрос:
SELECT * FROM CODE_TABLE WHERE CODE = 'ABC';
Это будет работать.Если мы выполним тот же запрос, передав другой параметр, он завершится ошибкой:
SELECT * FROM CODE_TABLE WHERE CODE = 'DEF';
Возвращаемые ошибки:
ORA-02002: error while writing to audit trail
ORA-22922: nonexistent LOB value
В некоторых случаях мы обнаружили, что перезаписькод вокруг кажется, что запрос Linq это исправляет.Изменено:
var userRoleCode = _unitOfWork.Users.Find(u => u.EmployeeId == username.ToUpper() || u.EmployeeId == email.ToUpper()).FirstOrDefault().RoleCode;
на:
username = username.ToUpper();
email = email.ToUpper();
var userRoleCode = _unitOfWork.Users.Find(u => u.EmployeeId == username || u.EmployeeId == email).FirstOrDefault().RoleCode;
В другом случае сохранение запроса Linq в предикат и передача его в исправленной проблеме.Запросы SELECT, напечатанные в VS Output, идентичны во всех этих случаях, но каким-то образом они работают волшебным образом, когда мы немного корректируем код.
Единственные вещи, которые мы можем найти в Интернете относительно этих ошибок ORA, включают проверку табличного пространства инаши администраторы утверждают, что осталось достаточно табличного пространства.
- Есть ли что-то, что мы делаем неправильно в том, как мы используем EF или пишем наши запросы Linq?Он работал на одной БД, а не на другой.
- Есть ли в EF какой-то локальный кеш вне папки проекта VS, который необходимо очистить?У кого-нибудь есть идеи, почему это может происходить?
Редактировать: Для ясности, наш .Find()
метод, упомянутый выше, просто:
public IList<TEntity> Find(Expression<Func<TEntity, bool>> predicate) => Context.Set<TEntity>().Where(predicate).ToList();