2012-03-14 52 views
0

爲什麼EF(4.0)花費這麼長時間才能將行插入表中?當我剛剛關閉應用程序後查詢數據時,它返回了大約20000行,之後我注意到,雖然應用程序已關閉,但數據未完成插入,插入操作發生在後臺。爲什麼是這樣?有什麼方法來通知應用程序(我計劃將這些插入作爲Windows服務運行,因爲它們長期運行)插入真的完成了嗎?有什麼方法來提高這些插入的速度?我只有一個外鍵關係,所以它也不是一個非常複雜的數據模型。謝謝你的幫助!.Net EF在應用程序關閉後很長時間插入數據行

應用程序是ASP.Net應用程序。這是我撥打SaveChanges()的那段代碼。

do 
{ 
    if (token != null) 
    { 
     response = context.Execute<NetflixService.Title>(token) 
         as QueryOperationResponse<NetflixService.Title>; 
    } 

    using (Models.MovieContext movieCtxt = new Models.MovieContext()) 
    { 
     foreach (var item in response) 
     { 
      IList<Models.MovieGenre> genres = new List<Models.MovieGenre>(); 
      foreach (var genreIterator in item.Genres) 
      { 
       var genre = new Models.MovieGenre 
       { 
        Genre = genreIterator.Name 
       }; 
       genres.Add(genre); 
      } 

      //genres.Add(new Models.MovieGenre { Genre = "filmy" }); 
      var movie = new Models.MovieCatalog 
      { 
       MovieTitle = item.Name, 
       MovieGenres = genres 
      }; 

      movieCtxt.MovieCatalogs.Add(movie); 
     } 

     movieCtxt.SaveChanges(); 
    } 

} 
while ((token = response.GetContinuation()) != null); 
+0

如果在程序關閉後它仍在繼續,那麼它必須位於數據庫中,例如,趕上它的交易日誌。數據庫是什麼?有多少行,有多少/你在桌上有多麼複雜的指標等等?沒有更好的方法來插入所有的數據嗎? – Rup 2012-03-14 17:20:57

+0

如何關閉ASP.NET應用程序?你正在殺死Web服務器還是停止在Visual Studio中進行調試?停止調試不會停止Web服務器的運行。當SaveChanges()返回時插入完成。爲了表現你必須展示你的代碼草圖。 「*花了這麼久*」是什麼意思? – Slauma 2012-03-14 19:27:57

+0

感謝您的回覆。我已經添加了代碼。請檢查。 – learnnew 2012-03-14 20:48:29

回答

1

我的猜測是,你實際上是使用EF> = 4.1(DbContext),而不是EF 4.0正如你所說的(因爲ObjectSet<T>沒有一個Add方法,但使用的是movieCtxt.MovieCatalogs.Add(movie)在EF 4.0中,您將使用。AddObject

在這種情況下禁止自動變化檢測到提高批量插入的性能:

using (Models.MovieContext movieCtxt = new Models.MovieContext()) 
{ 
    movieCtxt.Configuration.AutoDetectChangesEnabled = false; 

    //... 
} 

更多細節在這裏:

正如已經在註釋中說,有必要殺死web服務器真正停止應用程序。關閉瀏覽器或在Visual Studio中停止調試不會導致應用程序終止。

SaveChanges()返回時,將數據插入到數據庫中。 SaveChanges不批量處理所有INSERT語句,它實際上將它們逐個發送到數據庫,並在發送最後一條語句時結束。

相關問題