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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了首先是EF6代码:如何在启动时从EDMX文件加载DbCompiledModel?相关的知识,希望对你有一定的参考价值。

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

为DbContext编写EDMX文件很容易:

EdmxWriter.WriteEdmx(myDbContext, XmlWriter.Create(@"C:	emplah.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获取它并在构建新上下文时提供它。问题是一切都是私有的,所以它不会序列化任何东西。

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

1)在OnModelCreating结束时(如果你先使用代码),你可以做到

modelBuilder.Build().Compile()

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

2)序列化那一个。与私人成员合作尝试查看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

以上是关于首先是EF6代码:如何在启动时从EDMX文件加载DbCompiledModel?的主要内容,如果未能解决你的问题,请参考以下文章

EF6添加mysql的edmx实体时报错:无法生成模型:“System.Data.StrongTypingException: 表“TableDetails”中列“IsPrimaryKey”的值为 D

EF6:如何避免循环引用?

使用映射从 edmx 生成 dbcontext 对象

如何在应用程序启动时从 java 代码更改 Hibernate connection.url 属性

如何首先在 EF6 代码中设置唯一的属性 [重复]

请教在Spring MVC中,如何实现启动时从数据库读取信息