2017-04-21 124 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