Сначала код EF6: Как загрузить DbCompiledModel из файла EDMX при запуске?

Я хочу сократить время запуска в EF6, кэшируя DbCompiledModel на диск.

Файл EDMX легко написать для DbContext:

EdmxWriter.WriteEdmx(myDbContext, XmlWriter.Create(@"C:\temp\blah.xml"))

И легко передать DbCompiledModel в DbContext:

var db = new DbContext(connectionString, myDbCompiledModel)

Однако, похоже, нет никакого способа прочитать файл EDMX с диска в DbCompiledModel! Как я могу это сделать?

Обратите внимание, что я успешно реализовал решение с использованием инструмента EdmxReader в этой разветвленной версии EF6:

https://github.com/davidroth/entityframework/tree/DbModelStore

Однако я неохотно использую версию филиала в производственной среде. Я попытался извлечь утилиту EdmxReader из этой ветви, но она опирается на внутренний конструктор DbCompiledModel, к которому я не могу получить доступ.

Итак, как я могу получить файл EDMX с диска и преобразовать его в DbCompiledModel?

1 ответ

Я проверил, смогу ли я заставить его работать, сериализовав DbCompiledModel.

Как получение его из EF, так и предоставление его при создании нового контекста работает. Проблема в том, что все приватно, поэтому ничего не сериализуется.

Если вы можете получить сериализатор, который вы используете для сериализации частных членов, это должно быть довольно просто.

1) В конце OnModelCreating (если вы сначала используете код) вы можете сделать

modelBuilder.Build().Compile()

Немного упрощен, поскольку вы должны предоставить некоторые аргументы

2) Сериализуйте это. Для работы с закрытыми членами попробуйте посмотреть на JSON.Net: Принудительная сериализация всех закрытых полей и всех полей в подклассах или использовать BinaryFormatter. Почему BinaryFormatter сериализует закрытые члены, а не XMLSerializer или SoapFormatter?

3) Сохраните это на диск

4) Считать файл с диска и десериализовать его в новую модель DbCompiledModel.

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