【问题标题】:Entity Framework DateTime update extremely slowEntity Framework DateTime 更新极慢
【发布时间】:2012-06-01 16:36:38
【问题描述】:

我目前在使用 Entity Framework 时遇到这种情况:

using (TestEntities dataContext = DataContext)
            {
                UserSession session = dataContext.UserSessions.FirstOrDefault(userSession => userSession.Id == SessionId);
                if (session != null)
                {
                    session.LastAvailableDate = DateTime.Now;
                    dataContext.SaveChanges();
                }
            }

这一切都很完美,除了它与我预期的相比非常慢(每秒 14 次调用,经过 100 次迭代测试)。当我通过这个命令手动更新这条记录时:

dataContext.Database.ExecuteSqlCommand(String.Format("update UserSession set LastAvailableDate = '{0}' where Id = '{1}'", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fffffff"), SessionId));

我每秒接到 55 个电话,这已经足够快了。但是,当我不更新 session.LastAvailableDate 但我使用 Entity Framework 更新整数(例如 session.UserId)或字符串时,我每秒会收到 50 个调用,这也足够快。只有日期时间字段非常慢。

因素 4 的差异是不可接受的,我想知道如何改进这一点,因为我不喜欢使用直接 SQL,而我也可以使用实体框架。

我正在使用 Entity Framework 4.3.1(也尝试过 4.1)。

【问题讨论】:

  • 尝试使用 MiniProfiler(在 NuGet 中搜索)。它将向您显示 SQL EF 生成和执行时间,以便您查明问题所在。
  • 感谢您的提示,我不知道。我会调查的。
  • 如果你找出问题所在,请花两分钟在这里写下你自己问题的答案:)

标签: c# wcf entity-framework datetime entity-framework-4


【解决方案1】:

需要指出的是,您的 sql 命令只是一个查询,而您的 EF 命令是两个查询(获取数据,然后保存),因此您可以看到 2 倍的差异。

此外,您可能会发现通过 ID 查询而不是临时查询可以获得更好的性能。假设 SessionId 是主键查找。

UserSession session = dataContext.UserSessions.Find(SessionId);

【讨论】:

  • 我知道 EF 正在使用两个查询,但是当我更新该会话的另一个字段时(例如:session.UserId 而不是 session.LastAvailableDate),我仍然每秒收到 50 个调用,而当我更新 DateTime 字段时,我的表现很糟糕。我知道并已经尝试过 Find 方法,但它并没有提高性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2011-09-06
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
相关资源
最近更新 更多