首先是EF6代码:如何在启动时从EDMX文件加载DbCompiledModel?

Bre*_*ill 8 entity-framework edmx ef-code-first entity-framework-6.1

我想通过将DbCompiledModel缓存到磁盘来减少EF6中的启动时间.

为DbContext编写EDMX文件很容易:

EdmxWriter.WriteEdmx(myDbContext, XmlWriter.Create(@"C:\temp\blah.xml"))
Run Code Online (Sandbox Code Playgroud)

并且很容易将DbCompiledModel传递给DbContext:

var db = new DbContext(connectionString, myDbCompiledModel)
Run Code Online (Sandbox Code Playgroud)

但是,似乎没有任何方法可以将EDMX文件从磁盘读入DbCompiledModel!我怎样才能做到这一点?

请注意,我已在此分支版本的EF6中使用EdmxReader工具成功实施了该解决方案:

https://github.com/davidroth/entityframework/tree/DbModelStore
Run Code Online (Sandbox Code Playgroud)

但是,我不愿意在生产环境中使用分支版本.我试过从这个分支中提取EdmxReader实用程序,但它依赖于我无法访问的DbCompiledModel的内部构造函数.

那么,我如何从磁盘获取EDMX文件并将其转换为DbCompiledModel?

Mik*_*son 1

我测试了是否可以通过序列化 DbCompiledModel 来使其工作。

从 EF 获取它并在构建新上下文时提供它都有效。问题是一切都是私有的,所以它不会序列化任何东西。

如果您可以获得用于序列化私有成员的序列化程序,那么它应该非常简单。

1)在 OnModelCreating 结束时(如果您首先使用代码)您可以执行以下操作

modelBuilder.Build().Compile()
Run Code Online (Sandbox Code Playgroud)

稍微简化,因为您应该提供一些参数

2)序列化那个。对于使用私有成员,请尝试查看JSON.Net:强制序列化所有私有字段和子类中的所有字段或尝试使用 BinaryFormatter为什么 BinaryFormatter 序列化私有成员而不是 XMLSerializer 或 SoapFormatter ?

3)将其保存到磁盘

4)从磁盘读取文件并将其反序列化为新的DbCompiledModel