我想通过将DbCompiledModel缓存到磁盘来减少EF6中的启动时间。
为DbContext编写EDMX文件很容易:
EdmxWriter.WriteEdmx(myDbContext, XmlWriter.Create(@"C:\temp\blah.xml"))
将DbCompiledModel传递给DbContext很容易:
var db = new DbContext(connectionString, myDbCompiledModel)
但是,似乎没有任何方法可以从磁盘将EDMX文件读取到DbCompiledModel中!我怎样才能做到这一点?
注意,在此分支版本的EF6中,我已经使用EdmxReader工具成功实现了该解决方案:
https://github.com/davidroth/entityframework/tree/DbModelStore
但是,我不愿意在生产环境中使用分支版本。我尝试从此分支中提取EdmxReader实用程序,但它依赖于DbCompiledModel的内部构造函数,而我无法访问它。
那么,如何从磁盘获取EDMX文件并将其转换为DbCompiledModel?
最佳答案
我测试了是否可以通过序列化DbCompiledModel使其工作。
从EF获取它并在构建新上下文时提供它都是可行的。问题在于,所有内容都是私有(private)的,因此不会序列化任何内容。
如果您可以获得用于序列化私有(private)成员的序列化程序,则它应该非常简单。
1)在OnModelCreating的结尾(如果您首先使用代码),您可以执行
modelBuilder.Build().Compile()
稍微简化,因为您应该提供一些参数
2)序列化那个。对于与私有(private)成员一起工作,请尝试查看JSON.Net: Force serialization of all private fields and all fields in sub-classes或尝试使用BinaryFormatter Why is the BinaryFormatter serializing private members and not the XMLSerializer or the SoapFormatter ?
3)将其保存到磁盘
4)从磁盘读取文件并将其反序列化为新的DbCompiledModel