从 LINQ to SQL 升级到 EF 4.1 时,如何最大限度地减少性能损失?

2024-04-27

我最近将一个使用 LINQ to SQL 和 SQL Server CE 3.5 的应用程序更新为 Entity Framework 4.1 Code First 和 SQL Server CE 4.0,现在它的运行速度明显变慢。我在之前和之后做了一些秒表测试,我的应用程序的大多数主要操作似乎平均运行速度慢了 40% 左右。

除了禁用级联删除之外,我正在使用 EF Code First 的所有默认策略和配置。

当我最初发布这个问题时,我关注的是一个似乎花费特别长的查询,但我后来意识到它只是在第一次运行时特别慢(请参阅下面的评论线程)。

我现在认为我看到的是大多数查询运行速度变慢 - 不是显着变慢,而是慢到足以快速累加,因为应用程序执行的大多数操作都涉及多个查询。

这个应用程序有一个非常小的数据库。 SQL CE (.sdf) 文件只有 458 KB,最大的表只有不到 250 条记录。

下面是 POCO 类的示例:

public class Target
{
    public int Id { get; set; }
    public int TrialDefinitionId { get; set; }
    public int Number { get; set; }
    public int X { get; set; }
    public int Y { get; set; }
    public string Phase { get; set; }
    public virtual TrialDefinition TrialDefinition { get; set; }
}

我的所有类都遵循这个基本模式(简单类型+虚拟属性来获取通过外键链接的对象)。我有一个类使用ICollection获取多对一关系的列表。

最后一点:我使用存储库模式作为中介,并且存储库的每次使用都放在using堵塞。对于“获取”操作,一旦我从数据库获取了所需的数据,这就会导致实体分离。

有人有任何具体策略来提高我的 EF Code First 应用程序的性能吗?请记住,我还没有机会详细阅读 EF。我主要只是尝试尽可能快速、轻松地从 LINQ to SQL 迁移到 EF。对我来说最有用的答案是更改特定策略或配置或其他设置。


最后注意事项:我使用存储库模式作为中介,并且存储库的每次使用都放置在 using 块中。对于“获取”操作,一旦我从数据库获取了所需的数据,这就会导致实体分离。

嗯,这不是必需的...

  1. 实体框架的默认架构已经实现了存储库模式。
  2. 保持 ObjectContext 处于活动状态并不意味着您保持与数据库的连接处于活动状态。
  3. 仅当您从数据库加载或保存更改时,才会从连接池中获取新连接并执行操作。

当然,使用块会减慢,因为每个使用块都会执行以下操作,

  1. 初始化上下文(需要从资源加载元数据)
  2. 验证一些事情
  3. 打开与数据库的连接
  4. 执行你的任务
  5. 清理并关闭数据库

现在,前两个步骤肯定会花费大量时间,并且您的应用程序中将有多个相同类型的对象寿命更长,因为每个新上下文都会为每个查询创建相同对象的新副本。

实体框架已经实现了身份映射,这意味着它将在上下文的整个生命周期中保持对象处于活动状态,并且同一主键仅保留一份对象副本,这不仅可以节省内存,而且可以更快地执行。

我建议不要对每个查询或较小的步骤使用“使用块”,而是应该在应用程序的整个生命周期中保持 ObjectContext 处于活动状态。而且您根本不需要实现缓存或存储库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 LINQ to SQL 升级到 EF 4.1 时,如何最大限度地减少性能损失? 的相关文章

  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • WPF MVVM将DataTable绑定到DataGrid不显示数据

    我有一个简单的控件 其中包含一个 DataGrid 其中 ItemsSource 绑定到 DataTable 当我填充 DataTable 时 我可以看到 DataGrid 中添加了行 但没有显示任何数据 我没有为此 DataGrid 使用
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • 用 C++ 解密文件,该文件使用 openssl -aes-128-cbc 加密

    我正在尝试用 C 解密文件 该文件使用以下命令加密 openssl enc nosalt aes 128 cbc pass pass test in test txt out test enc txt p 控制台显示key 098F6BCD
  • 无法更新 .mdf 数据库,因为该数据库是只读的(Windows 应用程序)

    我使用 C 创建了一个数据库 Windows 应用程序 我的应用程序在 Windows XP 上成功运行 但在 Vista 或 Windows 7 系统上无法正确执行 我的应用程序显示类似以下内容的消息 无法更新 mdf 数据库 因为该数据
  • c++11 中的 std::thread 问题

    我在尝试从标准模板库编译具有多线程的程序时遇到一些麻烦 当我尝试编译以下程序时 它返回一个晦涩的错误 include
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 是否可以存根实体框架上下文和类来测试数据访问层?

    我熟悉用于测试 ASP NET MVC 应用程序中的控制器和业务逻辑的技术 我们的应用程序中的数据访问集中在松散耦合的特殊服务中 使用接口并通过实体框架与实际数据库一起使用 然而 随着 DAL 变得越来越复杂 隐藏数据库实现细节并为应用程序
  • #define, #ifdef #undef #endif

    我有以下代码 define PROC ADD void main void while 1 ifdef PROC ADD Do this code here then undefined it to run the code in the
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 为了清楚起见,是否应该在返回类型上使用无用的类型限定符?

    当我们的头文件中有原型时 我们的静态分析工具会抱怨 返回类型上有无用的类型限定符 例如 const int foo 我们这样定义它是因为该函数返回一个永远不会改变的常量 认为 API 看起来更清晰const到位 为了清楚起见 我觉得这类似于
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足

随机推荐