2012-03-14 73 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

相关问题