【问题标题】:EF6 code first: How to load DbCompiledModel from EDMX file on startup?EF6 代码优先:如何在启动时从 EDMX 文件加载 DbCompiledModel?
【发布时间】:2015-03-05 04:38:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我测试了是否可以通过序列化 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

    【讨论】:

    • Brendan,Mikael 非常好心地测试了我在与他分享后通过电子邮件发送给您的想法。让我们知道这是否有效!
    • Mikael,感谢您回答这个问题。我尝试使用具有各种设置的 BinaryFormatter 和 JSON.Net 序列化 DbCompiledModel,但遇到了自引用和非 [Serializable] 问题。我已经开始了一个单独的问题,这里有详细信息。你能解释一下吗,你能把它序列化吗? stackoverflow.com/questions/32109897/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多