2011-09-08 59 views
1

當前使用Activeonic的Subsonic 3。純粹出於好奇,是否有一種簡單的方式來更新或插入一個乾淨而廉價的記錄?亞音速3 - 插入更新

而不是

var record = MyModal.SingleOrDefault(x => x.id == 1) 
if (record != null) 
{ 
    // code to update record here 
} else { 
    // code to insert a record here 
    MyModal record = new MyModal(); 
    record.attribute1 = "blah" 
    ... blah blah 
} 

回答

1

標準ActiveRecord模板提供了一個Save()方法,該方法根據對象IsNew()調用Add()或Update()。它應該在你給的樣品中工作。

0

你也應該能夠做到這一點是這樣的:

  // perform insert with a linq expression 
      db.Insert.Into<PARTS_VI_PART_NUMBER>(
       x => x.ITEM_NUMBER, 
       x => x.ITEM_CLASS_CODE, 
       x => x.ITEM_DESCRIPTION, 
       x => x.MANUFACTURER 
      ).Values(
       "TEST", 
       "TEST", 
       "TEST", 
       "TEST" 
      ).Execute(); 

      // update using linq expression 
      db.Update<PARTS_VI_PART_NUMBER>() 
       .Set(x => x.ITEM_DESCRIPTION == "UPDATED", 
        x => x.ITEM_CLASS_CODE == "UPDATED2") 
       .Where(x => x.ITEM_NUMBER == "TEST") 
       .Execute(); 

      // delete inserted row with a linq expression 
      db.Delete<PARTS_VI_PART_NUMBER>(x => x.ITEM_NUMBER == "TEST").Execute(); 

至少這是如何我在我的項目之一,已經做了。 將Insert(),Update()Delete()方法生成的Context.tt轉換爲Context.cs文件(我使用的是「ActiveRecord」T4文件)。


編輯

哦,對不起,當我讀福斯特你的問題,我還以爲你要求更簡單的方法「插入」或「更新」,但經過重新 - 讀它,我意識到你要求「插入,或更新,如果它已經存在」像做'upsert'。

對不起,我的答案並沒有真正覆蓋。我也不知道做這件事的好方法。我通常只會做你正在做的事情...嘗試選擇它,如果我沒有得到任何結果,請執行插入操作。

+0

不用擔心隊友。 – Jamsi

+0

只是希望它具有Rails的find_or_create幫助器方法:P – Jamsi

+0

這是一個開源項目......隨意添加一個;)不幸的是,那是沒有得到很好支持的事情之一。 Ansi sql提供了「merge into」語句,但並不是每個DB都實現它。一些有自己的語法。我認爲不可能將其添加到SubSonic中。它只是爲每個支持的數據庫添加它並進行測試。 – CodingWithSpike