2012-03-14 46 views
1

我正在開發一個使用SQL Server Compact Edition數據庫和實體框架的WPF應用程序,但我得到的性能確實非常低,無法更新和刪除。所以我創建了一個簡單的Foobar控制檯應用程序(下圖),並得到了同樣的問題。使用Entity Framework 4.3和SQL Server Compact Edition 3.5進行緩慢更新

我知道Entity Framework會創建一些開銷,並且SQL Server Compact Edition比常規SQL Server慢。但INSERTUPDATE/DELETE之間的差異是多少?

public static void CreateFoobars() 
    { 
     DateTime start = DateTime.Now; 

     for (int i = 0; i < 10000; i++) 
     { 
      Foobar foobar = new Foobar(); 
      foobar.FoobarID = i; 
      foobar.Column1 = "Column1"; 
      foobar.Column2 = "Column2"; 
      foobar.Column3 = "Column3"; 
      foobar.Column4 = "Column4"; 

      _localRepository.CreateFoobar(foobar); 
     } 

     bool result = _localRepository.Save(); 

     TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now); 

     Console.WriteLine("Created Foobars? {0}, Time: {1}", result, timeSpan); 
    } 

    public static void CountFoobars() 
    { 
     Console.WriteLine("Count Foobars: {0}", _localRepository.GetAllFoobars().Count()); 
    } 

    public static void UpdateFoobars() 
    { 
     DateTime start = DateTime.Now; 

     for (int i = 0; i < 10000; i++) 
     { 
      Foobar foobar = new Foobar(); 
      foobar.FoobarID = i; 
      foobar.Column1 = "Column11"; 
      foobar.Column2 = "Column22"; 
      foobar.Column3 = "Column33"; 
      foobar.Column4 = "Column44"; 

      _localRepository.UpdateFoobar(foobar); 
     } 

     bool result = _localRepository.Save(); 

     TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now); 

     Console.WriteLine("Updated Foobars? {0}, Time: {1}", result, timeSpan); 
    } 

    public static void DeleteFoobars() 
    { 
     DateTime start = DateTime.Now; 

     for (int i = 0; i < 10000; i++) 
     { 
      _localRepository.DeleteFoobar(i); 
     } 

     bool result = _localRepository.Save(); 

     TimeSpan timeSpan = CalculateTimeSpan(start, DateTime.Now); 

     Console.WriteLine("Deleted Foobars? {0}, Time: {1}", result, timeSpan); 
    } 

public IQueryable<Foobar> GetAllFoobars() 
    { 
     return _entities.Foobars; 
    } 

    public Foobar GetFoobar(int foobarID) 
    { 
     return _entities.Foobars.ByFoobarID(foobarID).FirstOrDefault(); 
    } 

    public bool CreateFoobar(Foobar foobar) 
    { 
     try 
     { 
      _entities.AddToFoobars(foobar); 
     } 
     catch (Exception e) 
     { 
     } 

     return false; 
    } 

    public bool UpdateFoobar(Foobar foobar) 
    { 
     try 
     { 
      Foobar f = this.GetFoobar(foobar.FoobarID); 

      if (f != null) 
      { 

       f.Column1 = foobar.Column1; 
       f.Column2 = foobar.Column2; 
       f.Column3 = foobar.Column3; 
       f.Column4 = foobar.Column4; 

       return true; 
      } 
     } 
     catch (Exception e) 
     { 
     } 

     return false; 
    } 

    public bool DeleteFoobar(int foobarID) 
    { 
     try 
     { 
      Foobar f = this.GetFoobar(foobarID); 

      if (f != null) 
      { 
       _entities.DeleteObject(f); 

       return true; 
      } 
     } 
     catch (Exception e) 
     { 
     } 

     return false; 
    } 

    public bool Save() 
    { 
     try 
     { 
      this.Context.SaveChanges(); 

      return true; 
     } 
     catch (Exception e) 
     { 
     } 

     return false; 
    } 

結果(與SSD和16 RAM一個I7,幾乎增加了一倍時間上的較老C2D)

  • 計數Foobars:0
  • 創建Foobars? True,Time:00:00:04:0700057
  • Count Foobars:10000
  • 更新Foobars?真,時間:00:00:59:8800838
  • 計數Foobars:10000
  • 已刪除Foobars?的確,時間:00:00:57:8000810
  • 計數Foobars:0

數據庫測試

  • 惰性加載=假
  • 禁用身份。
+1

從來沒有找到任何解決這個問題的辦法,我改用SQL Express代替。 – 2012-04-11 13:45:47

回答

0

我懷疑你更快地創建功能,因爲它只是創造10000個的本地對象,然後提交他們都在一步到數據庫中,而你的刪除和更新功能從數據庫中更改它之前所有查詢一個項目。

+0

是的,但沒有其他方式更新或刪除?選擇一個Foobar的速度很快,那麼爲什麼更新或刪除時性能會下降?實體框架中的SQL Compact Edition總是如此緩慢?如果是這樣,那麼我必須圍繞SQL Express構建我的WPF應用程序,或者嘗試在沒有實體框架的情況下進行更新和刪除。 – 2012-03-15 09:12:40

相關問題