2012-07-02 41 views
7

通過C#使用asp.net 4。LINQ to SQL - 更新記錄

在我的數據訪問層,我有保存和更新記錄的方法。節省很簡單,但更新很繁瑣。

我以前用過SubSonic,因爲它有活躍的記錄,並且知道如果我加載了一條記錄,改變了一些條目然後再保存它,它就認爲它是一個更新,並沒有試圖保存一個新的進入數據庫。

我不知道如何在LINQ中做同樣的事情。其結果是我的工作流程是這樣的:

  1. 網頁抓取「記錄A」從DB
  2. 它的一些值由用戶改變。
  3. '記錄A'被傳回到數據訪問層
  4. 我現在需要再次加載記錄A,調用它'SavedRecord A',用傳入的'記錄A'中的值更新此對象中的所有值,然後更新/保存'SavedRecord A'!

如果我只保存'記錄A',我最終會在數據庫中添加一個新條目。

很顯然,這會更好,只是通過記錄a和做類似:

RecordA.Update(); 

我假定有我丟失的東西在這裏,但我無法找到上線一個直截了當的回答。

回答

1

當LINQ到SQL更新數據庫中的記錄,它需要確切地知道哪些字段被更改以便僅更新它們。你基本上有三種選擇:

  • 當更新的數據回發到Web服務器,從數據庫中加載現有的數據,將所有屬性加載的對象,並調用SubmitChanges()。任何分配了現有值的屬性都不會被更新。
  • 跟蹤對象的未修改狀態並使用Attach以及未修改和修改的值。
  • 使用樂觀併發檢查所需的所有狀態(如果啓用,默認情況下爲此)初始化一個新對象。然後附加對象並最終更新附加後的任何更改的屬性,以使DataContext更改跟蹤器知道更新的內容。

我通常使用第一個選項,因爲它是最簡單的。有兩個數據庫調用會導致性能損失,但除非您正在進行大量更新,否則無關緊要。

+0

謝謝,有沒有更好的方法做這件事有點令人驚訝。自從開始使用LINQ to SQL以來,我一直在做'兩個數據庫調用'方法,但我一直有一種嘮叨的感覺,我錯過了一個明顯更容易的答案。看起來我沒有,這是好的和壞的。 –

2

您可以使用Table實例上的Attach method並通過DataContext上的SubmitChanges()方法進行提交。

這個過程可能不像我們想的那樣直截了當,但您可以閱讀David DeWinter的LINQ to SQL: Updating Entities以獲得更深入的解釋/教程。

+0

THanks,會檢查出來。 –

1

假設你有一個產品類別或數據庫,那麼你將不得不這樣做。

DbContext _db = new DbContext(); 

    var _product = (from p in _db.Products 
            where p.Id == 1 // suppose you getting the first product 
            select p).First(); // this will fetch the first record. 

    _product.ProductName = "New Product"; 

    _db.SaveChanges(); 

     // this is for EF LINQ to Objects 
    _db.Entry(_product).State = EntityState.Modified; 
    _db.SaveChanges(); 

------------------------------------------------------------------------------------- 
this is another example using Attach 
------------------------------------------------------------------------------------- 

public static void Update(IEnumerable<Sample> samples , DataClassesDataContext db) 
{ 
    db.Samples.AttachAll(samples); 
    db.Refresh(RefreshMode.KeepCurrentValues, samples) 
    db.SubmitChanges(); 
} 

如果您將實體上下文,然後刷新(與選定KeepCurrentValues),LINQ到SQL將獲得這些實體的服務器,對它們進行比較,並標記更新的那些不同

+0

謝謝,在我的情況下,雖然我不會真正知道哪些字段已經改變,因爲用戶將會進行編輯。因此,我必須假設所有字段都已更改並相應地寫入更新。這很乏味,但至少我知道現在我一直在做'正確'的方式,即使它看起來不像。 –

+0

不管用戶編輯了哪些字段,只要你通過HTTPPOST方法將模型傳遞給控制器​​中的ActionResult並調用SaveChanges(),整個記錄在數據庫中得到更新。 –

+0

那麼,是否有可能在客戶端只傳回單個更改值+關鍵引用字段的情況下進行此項工作?假設你將它們傳遞給一個序列化的記錄,並且它們傳遞一個只包含兩個字段的更新的序列化記錄。到目前爲止,在我的測試中,LinqToSql只是試圖用空值覆蓋現有的數據。顯然這意味着你永遠不能顯式地null空nullable字段。試圖避免寫很多thisfield = thatfield。 – RoboJ1M