LINQ to SQL DataContext Кэширование - PullRequest
3 голосов
/ 26 января 2010

Я использую Linq to SQL в качестве уровня DAL, и во время модульного тестирования я обнаружил, что мои объекты возвращаются не из базы данных, а из кэша DataContext.

Странная вещь заключается в том, что когда объекты возвращаются из кэша, для чего требуется отдельный вызов базы данных для извлечения всех полей.

Во всяком случае, я реализовал метод ClearCache, который очистит кеш. Но я очищаю кеш только в модульном тесте, а не в коде API.

Причина в том, что после вставки объекта его хорошо загрузить из кеша, а затем снова извлечь его из базы данных.

Что ты думаешь?

ОБНОВЛЕНИЕ :

public static void ClearCache(this EStudyModelDataContext context)
        {
            const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
            var method = context.GetType().GetMethod("ClearCache", Flags);
            method.Invoke(context, null);
        }

Ответы [ 3 ]

3 голосов
/ 24 марта 2011

в моем случае работают только с 4 привязками:

DATACONTEXT.GetType().InvokeMember(
    "ClearCache",
    BindingFlags.Instance |
    BindingFlags.Public |
    BindingFlags.NonPublic |
    BindingFlags.InvokeMethod,
    null, DATACONTEXT, null);
1 голос
/ 29 января 2016

Есть одно большое предостережение при ручном вызове 'ClearCache' - это то, что вы делаете именно это! Итак, если у вас были какие-либо предшествующие операции с базой данных (ожидающие решения), вы просто сбрасывали их. Вы должны быть очень осторожны, чтобы не перейти к другим изменениям «При отправке». Я научился этому нелегко - поэтому мне пришлось добавить еще несколько операторов 'SubmitChanges' в мой код - как прямой результат реализации ClearCache после выполнения некоторых хранимых процедур (массовое удаление).

1 голос
/ 26 января 2010

Вы правы, что L2S будет возвращать элементы из кэша, когда это возможно. Я узнал об этом трудным путем. Чистым способом справиться с этим является создание context.RefreshRow после каждой операции вставки и обновления. Это обновляет кеш и гарантирует, что кеш актуален.

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