Проблема с очисткой LINQ Cache и DataContext
Сейчас я работаю над большим проектом, разработанным с использованием архитектуры N-уровня, разработанной с использованием Visual Studio 2008 и MSSQL Server 2005. В проекте использовался шаблон репозитория с внедрением зависимостей с использованием Unity.
Первая проблема возникает, когда в момент операций вставки, обновления и т. Д. В базу данных данные не были вставлены или обновлены в тот момент, когда пришлось закрыть приложение и открыть заново для просмотра новых данных.
После долгого чтения было обнаружено, что проблема в кеше LINQ, который не был очищен должным образом. Мы решили проблему вставки в класс, чтобы все сущности реализовали следующий метод:
public void ClearCache()
{
DataContextFactory.GetDataContextInstance(true);
Context.Log = Console.Out;
}
И это DataContextFactory
учебный класс:
public static class DataContextFactory
{
public static PromedDataContext Context;
public static PromedDataContext GetDataContextInstance(bool recreate)
{
return Context != null && !recreate ? Context : (Context = new PromedDataContext(GlobalAttributesProvider.DbConnectionPath));
}
}
Решение состояло в том, чтобы создать новый экземпляр DataContext и каждый раз, когда вы вставляете или обновляете значения, после вызова вышеупомянутого ClearCache
метод.
Проблема в том, что через некоторое время это решение работает, но в один момент стала появляться другая проблема, когда я попытался вставить данные в базу данных. Ошибка была следующей:
We attempted to attach or add an entity that is not new. Perhaps he had loaded another DataContext element. This operation is not supported.
Прочитав некоторое время для этой ошибки, я решил просто прокомментировать тело ClearCache
метод, потому что это создавало несколько экземпляров DataContext
и конечно это сломало мое решение кеша по частям.
Мой вопрос:
Есть другой способ очистить упомянутый кеш, избегая вышеуказанной ошибки? Или исправить вышеуказанную ошибку, оставив нетронутым ClearCache
метод?
заранее спасибо
Любая помощь приветствуется.
1 ответ
DataContext
Предполагается, что жить столько, сколько занимает "единица работы". Для веб-приложений это обычно один HTTP-запрос.
Вы делитесь DataContext
за всю работу, которая делается. Это не должно использоваться таким образом. Объекты в нем не являются кешем. Они необходимы для синхронизации состояния БД и состояния в памяти.
Исследуйте, что означает единица работы в контексте LINQ to SQL, и примените лучшие практики. В данный момент вы неправильно используете фреймворк, и вам придется делать экстремальные деформации, чтобы заставить его работать.