Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EF Code First, сбросить кэш DbCompiledModel 
:(
    Опции темы
KelTron
Дата 3.8.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Привет всем,

У меня есть некий класс, например MyContext, производный от DbContext.
При первом создании экземляра MyContext вызывается следующий метод:
OnModelCreating(DbModelBuilder modelBuilder)

В нем создаётся DbCompiledModel и присваивается контексту. При повторном создании контекста DbCompiledModel берётся из кэша. 

Проблема возникает когда я переключаюсь между Sql Server Compact и Sql Server, при создании контекста возникает следующая ошибка:
Using the same DbCompiledModel to create contexts against different types of database servers is not supported. Instead, create a separate DbCompiledModel for each type of server being used.

Таким образом мне нужно пересоздать DbCompiledModel перед переключением, но он всегда берётся и кэша..
Как можно сбросить этот кэш? Или есть более правильный способ решить эту проблему?

Это сообщение отредактировал(а) KelTron - 3.8.2011, 15:15


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
KelTron
Дата 5.8.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Нормального решения найти так и не удалось... после нескольких часов гугления и изучения MSDN я взялся за рефлектор и получилось это:
Код

private static void ClearDbCompiledModelCache()
        {
            var type = Type.GetType("System.Data.Entity.Internal.LazyInternalContext, EntityFramework, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

            var cmField = type.GetField("CachedModels",
                System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public
                | System.Reflection.BindingFlags.NonPublic);

            var cachedModels = cmField.GetValue(null);
            cachedModels.GetType().InvokeMember("Clear", System.Reflection.BindingFlags.Public
                | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod,
                null, cachedModels, null); 
        }

Знаю что это противоречит всем правилам ООП и тд, мне самому очень не нравится этот код, поэтому надеюсь, что среди вас найдётся спаситель и предложит правильное решение..)


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0387 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.