entity-framework - EF6 代码第一个 : How to load DbCompiledModel from EDMX file on startup?

标签 entity-framework ef-code-first edmx entity-framework-6.1

我想通过将 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

关于entity-framework - EF6 代码第一个 : How to load DbCompiledModel from EDMX file on startup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27816842/

相关文章:

c# - 覆盖 DLL 中的 DataModel

c# - 连接表是否隐式隐藏在 Entity Framework 图中?

asp.net - Microsoft.SqlServer.Types 有什么作用,它是如何工作的?

asp.net-mvc-4 - 在EF迁移配置类的Seed方法中获取App_Data文件夹的路径

c# - DbSet、模型构建器和 EF 导航属性

c# - Entity Framework 4.1 Code First EDMX 问题

c# - Controller 中的 "The entity or complex type cannot be constructed in a LINQ to Entities query"

c# - 如何使Entity Framework Code First使用SQL Azure DB?

c# - Entity Framework 4.1 Code First 和一对多映射问题

asp.net-mvc - 如何防止在DataFirst First模型中删除DataAnnotations属性