Проблема с очисткой 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, и примените лучшие практики. В данный момент вы неправильно используете фреймворк, и вам придется делать экстремальные деформации, чтобы заставить его работать.

Другие вопросы по тегам