我正在使用Entity Framework 4和SQL Server 2008 R2。我有一種情況,我想插入一個記錄,其主鍵字段可能與現有記錄匹配。我不想提出和錯誤,而是希望用新數據默默更新現有記錄。避免在EF中插入密鑰違規
我目前的實現是這樣的:
// Calculate primary key fields.
DateTime endDate = periodTime.AddMinutes(periodMins);
int meterId = pipe.MeterId;
// Try to load a matching record.
ProfileDatum lpRec = context.ProfileData.FirstOrDefault(rec => rec.MeterId == meterId && rec.EndDate == endDate);
// If it could not be loaded, create a new one.
if (lpRec == null)
{
lpRec = new ProfileDatum() {MeterId = meterId,
EndDate = endDate};
// Save the object in the context.
context.ProfileData.AddObject(lpRec);
}
// Fill lpRec.
這工作,但它的效率,可讀性和優雅很可怕。
堅持與實體框架和SQL Server 2008 R2,是否有任何方式來做類似於MySQL的「重複鍵更新」,我繼續進行,就像每次創建一個新記錄,並有數據庫更新時,有一個主要重點違規?或者也許還有其他一些優雅的方法?
效率很好,但在這種情況下次要;我追求的很簡單。這將是偉大的,是能夠 如下編寫,並忽略客戶端檢查:
// Assign primary key fields.
var lpRec = new ProfileDatum()
{
MeterId = pipe.MeterId,
EndDate = periodTime.AddMinutes(periodMins)
};
// Fill lpRec.
// Save the object in the context.
context.ProfileData.AddObject(lpRec);
在此先感謝您的幫助,即使是說,我現有的實現是最好的方式。
非常感謝!多快的迴應也是如此。 – 2011-01-24 18:20:42
此操作正在存儲可能多次傳送的數據(冗餘消息傳送)。我不認爲有任何安全或誠信問題,但我同意明確表達意圖是一個非常好的想法(tm)。 我將離開代碼,因爲它聽起來像會通過要求開發存儲過程來增加整體複雜性,然後間接以不會立即明顯看到的方式調用C#代碼片段。 我不知道低級SQL操作可能被覆蓋。謝謝! – 2011-01-24 18:26:40