2010-05-09 88 views
2

我怎樣才能做到這兩種情況。如何批量插入/更新LINQ到SQL?

目前,我做這樣的事情

public class Repository 
{ 
    private LinqtoSqlContext dbcontext = new LinqtoSqlContext(); 

    public void Update() 
    { 
    // find record 
    // update record 
    // save record (dbcontext.submitChanges() 
    } 

    public void Insert() 
    { 
     // make a database table object (ie ProductTable t = new ProductTable() { productname 
      ="something"} 
     // insert record (dbcontext.ProductTable.insertOnSubmit()) 
    // dbcontext.submitChanges(); 
    } 
} 

所以現在我試圖加載XML文件有什麼噸的記錄。首先我一次驗證一條記錄。然後我想將它們插入到數據庫中,而不是在每個記錄之後執行submitChanges(),而不是在最後做一個批量提交。

所以我有這樣的事情

public class Repository 
{ 
    private LinqtoSqlContext dbcontext = new LinqtoSqlContext(); 
    public void Update() 
    { 
    // find record 
    // update record 
    } 

    public void Insert() 
    { 
     // make a database table object (ie ProductTable t = new ProductTable() { productname 
      ="something"} 
     // insert record (dbcontext.ProductTable.insertOnSubmit()) 
    } 

    public void SaveToDb() 
    { 
     dbcontext.submitChanges(); 
    } 
} 

然後在我的業務層,我會做像

for(int i = 0; i < 100; i++) 
{ 
    validate(); 
    if(valid == true) 
    { 
     update(); 
     insert() 
    } 
} 

SaveToDb(); 

所以假裝我的for循環是對在XML中找到的所有記錄的計數文件。我首先驗證它。如果有效,那麼在插入記錄之前我必須更新表格。然後我插入記錄。

之後,我想保存一切。

我不知道是否可以在每次或每次更新之後進行大量保存。

但我認爲這對於插入一個肯定會起作用。

似乎沒有崩潰,我不知道如何檢查記錄是否被添加到dbcontext。

回答

2

簡單的答案是:你沒有。 Linq2Sql是很多東西 - 它不是批量上傳/批量複製的替代品。

  • 生成平面文件(CSV等)和新的數據
  • 加載到數據庫中使用批量加載機制
  • 如果數據是:你會使用ETL路線是很多更有效更新等 - 將其加載到臨時表中並使用MERGE命令將其合併到主表中。

Linq2Sql將通過設計總是吸入大量插入場景。 ORM只是不是ETL工具。

+1

要添加到湯姆的答案,這裏是大樣的代碼中插入 http://www.dotnetcurry.com/ShowArticle.aspx?ID=323&AspxAutoDetectCookieSupport=1 – 2010-05-09 00:52:59

+0

那麼什麼是LINQ到SQL呢?如果你試圖插入一個又一個,它會忘記它們或什麼? – chobo2 2010-05-09 00:58:49

0

Linq2SQL(如前所述)默認情況下不能很好地處理這個問題,但幸運的是這裏有一些解決方案。 here's一個我用於網站,當我想做一些批量刪除。它對我來說效果很好,由於它使用了擴展方法,它與普通的Lin2SQL方法基本上沒有區別。

0

即使在調用SubmitChanges之前將多個記錄添加到DataContext,LINQ2SQL也會循環並逐個插入它們。您可以通過在實體類(「InsertMyObject(MyObject instance)」)上實現其中一個部分方法來驗證這一點。它將被單獨調用每個掛起的行。

我沒有看到你的計劃有什麼問題 - 你說它有效,但你只是不知道如何驗證它?你不能簡單地在數據庫中查看是否添加了記錄嗎?

查看DataContext中尚未添加哪些記錄的另一種方法是在數據上下文中調用GetChangeSet(),然後引用返回對象的「Inserts」屬性以獲取行列表當調用SubmitChanges時將插入它。

+0

雅那我怎麼覺得這是可行的。我想什麼,我試圖去後,所以你不必打開連接每一次。即使它仍然在逐一進行,它不必每次都打開和關閉數據庫。 – chobo2 2010-05-09 02:06:01

+0

我明白了。那麼它看起來像你有一個解決方案。我更新了我的答案,以更直接地解決您的問題。 – BlueMonkMN 2010-05-09 11:21:18

+0

好吧,這是我如何驗證,如果它沒有通過查看數據庫工作。當我試圖把他們都在的datacontext然後做的SubmitChanges沒有將所需提交。我在每次插入記錄後都改變了它,現在它工作得很好。我不明白爲什麼當你嘗試存儲它們時它不起作用。 – chobo2 2010-05-09 17:28:23

0

我還沒有真正「發佈」這個項目,但它是一個基於T4的知識庫系統,它擴展了Linq To SQL並實現了一堆批量操作(刪除,更新,創建csv等):http://code.google.com/p/grim-repo/。您可以查看源代碼並實施它,但您認爲合適。

而且,這個環節對批處理操作一些偉大的源代碼:http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

而且,還有,我知道這是誘人的,但不要對老年人的廢話。試着用DataAdapters/ADO.net執行批處理操作:http://davidhayden.com/blog/dave/archive/2006/01/05/2665.aspx。它速度更快,但不可避免地會更有毛髮。

最後,如果你有一個XML文件,你可以創建一個存儲過程,它接受SQL服務器的內置存儲過程,sp_xml_preparedocument中的優勢。看看如何在這裏使用它:http://msdn.microsoft.com/en-us/library/ms187367.aspx