2011-10-18 71 views
3

我有一種情況,即按日期從表中提取數據。如果在給定日期沒有提供數據,我使用默認值創建記錄並將其全部顯示給用戶。當用戶完成操作數據時,我需要提交更改。使用Entity Framework提交對數據庫的更改

所以我的問題是我如何處理實體框架提交一個表,哪裏可能有兩個更新並添加需要完成。這是在C#中使用MVC3和實體框架。

那麼這裏就是數據可能看起來像開始,

表A

NAME AGE PHONE_NUM 
Jim 25 555-555-5555 
Jill 48 555-551-5555 

與數據可能看起來像這樣做的用戶之後,

表A

NAME AGE PHONE_NUM 
Jim 25 555-555-5555 
Jill 28 555-551-5555 
Rob 42 555-534-6677 

如何提交這些更改?我的問題是有更新和插入需要?

我發現了一些這樣的代碼,但我不知道它是否會在這種情況下工作。

對於添加數據

entities.TABlEA.AddObject(TableOBJECT); 
entities.SaveChanges(); 

或更新數據

entities.TABLEA.Attach(entities.TABLEA.Single(t => t.NAME == TableOBJECT.NAME)); 
entities.TABLEA.ApplyCurrentValues(TableOBJECT); 
entities.SaveChanges(); 

的行將任何這項工作或做我需要跟蹤什麼有,並加入什麼?

想法?

回答

4

或多或少你已經有了解決方案。你只需要檢查你的Single試圖從數據庫加載對象的調用是否有結果(用SingleOrDefault代替)。如果結果是null你需要插入,否則更新:

foreach (var TableOBJECT in collectionOfYourTableOBJECTsTheUserWorkedWith) 
{ 
    var objectInDB = entities.TABLEA 
     .SingleOrDefault(t => t.NAME == TableOBJECT.NAME); 
    if (objectInDB != null) // UPDATE 
     entities.TABLEA.ApplyCurrentValues(TableOBJECT); 
    else // INSERT 
     entities.TABLEA.AddObject(TableOBJECT); 
} 
entities.SaveChanges(); 

(我假設NAME是你TableOBJECT實體的主鍵屬性。)

+0

那麼'Single'和'SingleOrDefault'之間有什麼區別? – Dan

+1

單個檢查查詢是否只有一個結果。如果沒有結果,Single將拋出異常。 SingleOrDefault檢查一個結果,如果查詢是空的,它將返回默認值(大部分時間爲NULL)。因此,當總是有一個結果時使用Single。如果可能根本沒有結果,請使用SingleOrDefault。 –

+0

所以我花了一段時間才能到達我可以使用它的地方,除了增加一個以上的東西,我從數據庫中獲得一個例外,抱怨沒有唯一的密鑰時,這很好。想法? – Dan

0

我認爲你必須保持跟蹤什麼是新的,什麼是修改的。如果你這樣做了,那麼你提供的兩個代碼示例將會起作用。 我使用的一個簡單的解決方法是檢查實體的主鍵屬性是否設置爲任何值。如果它被設置爲一個值,那麼這是一個更新的對象,否則它是新的。

另一種解決方案是使用實體框架的自我跟蹤實體,但我認爲這不是在Web應用程序中使用的正確方向(可能是在分佈式WCF應用程序中)。

相關問題