EF Code-first: как кешировать DbCompiledModel? - PullRequest
3 голосов
/ 27 марта 2011

Я настроил простой тестовый проект для EF 4.1 RC, используя подход Code-First.Я вижу, что каждый вызов нового MyContext () занимает довольно много времени.Я обнаружил, что есть конструктор, который принимает DbCompiledModel, и описание http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcompiledmodel(v=VS.103).aspx говорит, что этот объект хорошо кэшировать, для лучшей производительности.Но я не могу найти, как получить DbCompiledModel из существующего контекста.И в сети нет образцов.

Ответы [ 2 ]

9 голосов
/ 27 марта 2011

Модель уже кешируется. Вы можете легко проверить это, установив точку останова на ваш метод OnModelCreating. Это будет сделано только при первом создании контекста. Если вы хотите создать DbCompiledModel вручную, сначала вы должны создать DbModelBuilder вне контекста. Используйте метод Build, а затем Compile, получив в результате DbModel.

6 голосов
/ 27 марта 2011

Вот что я нашел после переосмысления.Вы можете получить копию скомпилированной модели со следующим кодом:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var model = modelBuilder.Build(Database.Connection);
        var compliedModel = model.Compile();
    }

Но когда я передал эту модель в свой контекст и сделал несколько тестов производительности, сравнил их с простым вызовом нового MyContext).Я обнаружил, что контекст уже кеширует скомпилированную модель, поскольку времена были идентичны.Таким образом, кэширование скомпилированной модели, по-видимому, необходимо только тогда, когда она создается вручную.

...