【问题标题】:How to optimize this entity framework code如何优化这个实体框架代码
【发布时间】:2025-12-30 22:05:07
【问题描述】:

我正在从 API 中获取电影元数据,并使用以下代码使用实体框架将它们添加到数据库中

此代码在调用一部电影时会占用高达 20% 的 CPU。我为一个插入使用一个上下文。 Add() 和 DBSet.Local.Where(..) 方法在这里是最昂贵的。如何优化代码以减少 CPU。

更新:在代码分析中,我发现 DBSet.Local.Where(..) 是 CPU 消耗的地方。我调用 DBSet.Local.Where 的原因是要找出我是否已经添加了该对象(人),这样我就不会重新添加它。想法?

【问题讨论】:

  • 在我看来,您在全球范围内持有一个 DbContext 并一次又一次地重复使用它。这是不好的。你应该new 一个在本地范围内,用它做少量的工作,SaveChanges,然后Dispose 并丢弃,最好使用using 语句并将其保持在 local 范围内.这些上下文并非旨在长期存在。
  • 通过延迟加载,这段代码每次插入必须进行数十次甚至更多的查询。延迟加载和性能不能很好地结合在一起。
  • 这是一个 asp.net 网站。我确实有一个长寿的背景。但我没有在这个中使用它。为每个电影 addorupdate 调用提供一个新的上下文。
  • 虽然延迟加载可能是一个问题,但代码分析器显示这行代码最消耗 CPU:var LocalDBPerson = Context.Persons.Local.Where(My => My.ID == APICast .Id).FirstOrDefault();

标签: c# entity-framework query-optimization local


【解决方案1】:

这个Movies.Where(My => My.ID == Movie.Id).FirstOrDefault()可以通过调用Movies.Find(Movie.Id)来优化。

查找具有给定主键值的实体。如果上下文中存在具有给定主键值的实体,则立即返回它而不向存储区发出请求。 https://msdn.microsoft.com/en-us/library/gg696418(v=vs.113).aspx

我没有看到针对 Add() 的任何优化

【讨论】: