Сначала код 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.