【问题标题】:How to read data faster in Entity Framework from SQL Server Compact C#如何从 SQL Server Compact C# 在实体框架中更快地读取数据
【发布时间】:2019-09-24 17:28:14
【问题描述】:

我使用的是 SQL Server Compact 版本 v4。

当我从实体中获取新信息时,需要 1 秒,但是当我从只有一条记录的表中计数时,需要 4 秒。

我使用了 Entity Framework 和 SQL Server Compact Edition。

在低配置的计算机上速度慢的原因是什么?

var db = new Entities();    // 1 second
db.User.count();            // 4 seconds

【问题讨论】:

  • 这些时间指标基本上没有意义。实例化上下文不会触及数据库,并且您没有指出您有多少行,第二次运行需要多长时间,文件所在的位置等。有太多因素无法给出答案。
  • 我在我提出的问题中写了表记录的数量。该表只有一条记录。@madreflection
  • 被忽略了。现在注意到了。不过,还有太多其他因素。
  • 这不是实体框架问题/问题,而是您的特定环境。

标签: c# sql entity-framework sql-server-ce compact-database


【解决方案1】:

打开连接可能会很慢,因此可能的解决方案是在应用启动时打开连接一次,并在应用的整个生命周期内保持该连接打开。

【讨论】:

  • 这很好,但是在编辑记录并尝试刷新信息时,我必须打开和关闭连接一次以显示已编辑的信息,否则它将向用户显示相同的信息.您对此有解决方案吗?@ErikEj
【解决方案2】:

对 DbContext 的第一个实例执行的第一个查询会触发 DbContext 的静态设置。这是解析所有映射的地方,以便 DbContext 准备好与 DbSet 和关联实体一起使用。上下文必须处理的实体定义越多,所需的时间就越长。

对于移动应用程序,我认为 EF 可能会导致数据访问成本过高,但是从一般 EF 经验来看,当用户启动他们的第一个实际查询时,您可以在应用程序启动时实施“热身”以避免这种打击:

using (var context = new Entities())
{
   bool result = context.Users.Any();
}

这可确保设置了静态上下文定义,并且上下文的所有其他实例都准备好立即执行。请注意,此成本仅适用于 DbContext 的第一个实例,对于其他 DbContext 实例,您没有此成本。这些实例应该是短暂的,并由 using 块限定,以确保它们被释放。对于移动应用程序,您可能需要考虑一个寿命更长的 DbContext,但我会警惕获取跟踪的实体(相反,在加载您不编辑的实体时使用 AsNoTracking())。被跟踪的实体可能会占用有限的资源,并可能导致未来的性能问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    相关资源
    最近更新 更多