【问题标题】:EF5 CodeFirst startup performance: generate edmx model at compile time?EF5 CodeFirst 启动性能:在编译时生成 edmx 模型?
【发布时间】:2013-11-02 19:47:53
【问题描述】:

我的应用程序使用带有 DbContext 的 EF5 和大约 100 个实体类。 初始化第一个上下文实例大约需要 5 秒,第一个查询大约需要 1 秒。 创建预编译查询后,所需时间减少到 4.5 秒和 0.1 秒。

因此,视图生成似乎特别加快了第一次查询的速度。 但第一次上下文初始化似乎只能从预编译查询中获益。

据我了解,EF 在运行时从实体类创建一个 EDMX 模型。 也许这会导致启动延迟。 我想尽可能多地从启动生成转移到编译时间。 为什么程序在每次启动时都应该计算相同的东西?

如果生成的数据依赖于例如连接字符串, 我想为每个单独的依赖项存储一次。 也许有一些包含生成数据的属性我可以序列化到一个文件并再次加载它以抑制启动延迟?

当我查看数据库迁移表时,其中包含一个编码和压缩的 EDMX。 似乎这一项将与当前一项进行比较以确定架构更改。 要存档此文件,EF 必须在每次启动时生成一个 EDMX。一次又一次..... 我喜欢缓存这个以加快速度。

在运行时,当应用程序可以信任数据库架构是最新的时, 我认为 EF 无论如何都应该简单地使用这个数据库存储的 EDMX?

【问题讨论】:

    标签: performance entity-framework edmx


    【解决方案1】:

    您正在寻找预编译视图(EDMX 的 .NET 表示形式)。通常这些视图是在运行时生成的,但您可以使用EF Power Tools 在设计时将它们生成为单独的项目文件,并将它们与您的项目一起构建。

    迁移表包含 EDMX,但除非您进行迁移,否则它不会影响您的性能。

    【讨论】:

    • 我不小心将“预编译视图”误命名为“预编译查询”。事实上,我正在使用这种优化。但它只获得了大约 20% 的优势。
    • 您使用的是 .NET 4.5 吗?
    • 是的,我使用的是 .NET 4.5
    • 我使用 InsightProfiler 跟踪了第一个上下文实例。 Entity.LazyInternalContext.InitializeContext 使用了 40% 的上下文构造函数。剩下的 60% 的时间被 CreateDatabaseIfNotExists.InitializeDatabase 吃掉了。我发现,当我用实现 IDatabaseInitializer 的无操作初始化程序替换此初始化程序时,整个启动速度从 6 秒加快到 2 秒!太好了!
    • 剩余的 2 秒用于使用 Entity.DbModelBuilder.Build 创建模型并编译模型,生成 DbCompiledModel 的实例。我真的很想像 EF 一样缓存这个 DbCompiledModel,但是当数据库连接字符串没有发生变化时,可以在下次启动时持久使用。任何提示如何达到这个目标?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2013-03-11
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多