2012-06-01 54 views
1

我有這種情況目前正在與實體框架:實體框架的DateTime更新速度極慢

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,當我也可以使用實體框架。

我正在使用實體框架4.3.1(也試過4.1)。

+0

嘗試使用MiniProfiler(在NuGet中搜索)。它會告訴你SQL EF生成和執行時間,所以你可以精確地指出問題所在。 –

+0

感謝您的提示,我不知道它。我會研究它。 –

+0

如果你找出問題,請花兩分鐘的時間在這裏寫下你自己的問題的答案:) –

回答

0

只要指出,你的sql命令只有一個查詢,而你的EF命令是兩個查詢(獲取數據,然後保存它),所以在那裏你可以看到一個2x的差異。

此外,您可能會發現通過ID查詢而不是即席查詢可以獲得更好的性能。假設SessionId是主鍵查找。

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

我知道EF使用兩個查詢,但是當我更新該會話的另一個字段(例如:會話。 UserId而不是session.LastAvailableDate),我仍然每秒獲得50個電話,而當我更新DateTime字段時,我的表現非常糟糕。我知道並且已經嘗試了Find方法,但它並沒有改善性能。 –