2017-04-21 215 views
-2

我試圖插入使用下面的LINQ查詢。不知何故,我得到了ID的重複記錄。有人能幫我解釋細節嗎?插入重複記錄LINQ

try { 
OLA_ASSESSMENT_DTL OAD = db.OLA_ASSESSMENT_DTL.SingleOrDefault(
    ev => ev.OAD_RIV_ID == id); 

transaction = "Modify"; // resetting the value of the variable 
if (OAD == null) { 
    transaction = "Add"; 
    OAD = new OLA_ASSESSMENT_DTL(); 
} 
OAD.OAD_PER_RELAIONSHIP = relationshipfocus.relationshipfocus; 
OAD.OAD_PER_RELAIONSHIP_COMMENT = CRecHelper.CheckIsNullString(relationshipfocus.strrelationshipfocus).ToString(); 
OAD.OAD_RIV_ID = id;  
OAD.OAD_MODIFIED_DATE = DateTime.Now; 
if (transaction == "Add") { 
    db.OLA_ASSESSMENT_DTL.Add(OAD); 
} 
db.SaveChanges(); 
} 
+1

無論是一個新的對象或沒有,你總是分配ID:'OAD.OAD_RIV_ID = ID;'。你如何期待**不**得到重複? –

+0

您是插入新記錄還是嘗試通過ID更新現有記錄? –

+0

@NaveenKN K N - 我試圖通過ID更新現有的記錄,如果有一個記錄目前的ID。如果沒有記錄,同時插入到具有該ID的同一個表中 – Alai

回答

0

起初,你正確地檢測重複記錄(雖然你可能應該使用FirstOrDefault代替SingleOrDefault,但是這是一個細節):

OLA_ASSESSMENT_DTL OAD = db.OLA_ASSESSMENT_DTL.SingleOrDefault(
     ev => ev.OAD_RIV_ID == id); 

transaction = "Modify"; // resetting the value of the variable 
if (OAD == null) 
{ 
    transaction = "Add"; 
    OAD = new OLA_ASSESSMENT_DTL(); 
} 

但後來,你隨便的ID分配給對象即使你知道這是一個重複:

OAD.OAD_RIV_ID = id; 

首先,刪除了這一行,因爲它是無用的:

  • 如果記錄已經存在,那麼你只是覆蓋ID與當前值
  • 如果記錄是重複的,那麼你設置的新的記錄重複的ID

相反,設置一個唯一的ID,當你知道的記錄是重複的,下面您爲表定義爲準策略:

OLA_ASSESSMENT_DTL OAD = db.OLA_ASSESSMENT_DTL.SingleOrDefault(
     ev => ev.OAD_RIV_ID == id); 

transaction = "Modify"; // resetting the value of the variable 
if (OAD == null) 
{ 
    transaction = "Add"; 
    OAD = new OLA_ASSESSMENT_DTL(); 
    // TODO: Assign a unique id, or let the database assign one if the column is auto-increment 
} 
+0

我錯過了爲列OAD_RIV_ID創建唯一約束。但是我在這張表中還有一些其他欄目用於運行號碼。現在,爲什麼我在使用** Id **值的同時獲取重複記錄。我懷疑在我到達db.SaveChanges()之前立即發送了兩個請求(doubleclick);第一次第二個請求被更新爲transaction = Add。我錯過了這個 – Alai

+0

有沒有可能爲列OAD_RIV_ID創建唯一約束。但是我在這張表中還有一些其他欄目用於運行號碼。現在,爲什麼我在使用Id值時獲取重複記錄?我懷疑在我到達db.SaveChanges()之前立即發送了兩個請求(doubleclick);第一次第二個請求被更新爲transaction = Add。有沒有這種可能性 – Alai