2011-07-22 188 views
1

我想记录的唯一标识,所以我不能有一个重复记录的我的ID违反PRIMARY KEY约束

我得到看起来像这样的,当我尝试更新我的SQL Server表的错误称为Clients

违反PRIMARY KEY约束'PK_clients'。无法在对象'db_owner.clients'中插入 重复键。

该代码,这看起来像这样:

public void Subscribe(string clientID, Uri uri) 
{ 
    clientsDBDataContext clientDB = new clientsDBDataContext(); 
    var client = new ServiceFairy.clientURI(); 
    client.clientID = clientID; 
    client.uri = uri.ToString(); 
    clientDB.clientURIs.InsertOnSubmit(client); 
    clientDB.SubmitChanges(); 
}    

任何想法我怎么能去修复这一点,所以我可以更新我的行,所有我希望能够做的就是当行存在,那么只更新相关的URI,如果它不存在提交新的clientID的+ URI,

感谢

约翰

回答

4

你想要做什么是对现有记录第一次检查,如果它不存在,然后添加一个新的。您的代码将始终尝试添加新记录。我假设你正在使用Linq2Sql(基于InsertOnSubmit)?

public void Subscribe(string clientID, Uri uri) 
{ 
    using(clientsDBDataContext clientDB = new clientsDBDataContext()) 
    { 
     var existingClient = (from c in clientDB.clientURIs 
           where c.clientID == clientID 
           select c).SingleOrDefault(); 

     if(existingClient == null) 
     { 
      // This is a new record that needs to be added 
      var client = new ServiceFairy.clientURI(); 
      client.clientID = clientID; 
      client.uri = uri.ToString(); 
      clientDB.clientURIs.InsertOnSubmit(client); 
     } 
     else 
     { 
      // This is an existing record that needs to be updated 
      existingClient.uri = uri.ToString(); 
     } 
     clientDB.SubmitChanges(); 
    } 
} 
+0

谢谢Joel这是一个很好的例子,让我更容易的了解如何整合,只是有这样一个例子让我的生活变得更容易haha –

+0

与你的评论相反 - Linq2Sql支持SingleOrDefault,适合在这种情况下使用它 – Pleun

+0

我的错误,看起来像我与最早版本的实体框架Linq2Sql混淆。我已更新我的示例。 –

3

您需要获取现有的对象并更新其uri属性,然后致电clientDB.SubmitChanges()。你现在的代码非常明确地要求它插入一条新记录。

想必像这样的工作:

using (clientsDBDataContext clientDB = new clientsDBDataContext()) { 
    var client = clientDB.clientURIs.Where(c => c.clientID == clientID).Single(); 
    client.uri = uri.ToString(); 
    clientDB.SubmitChanges(); 
} 
+1

或者如果您有旧状态的对象,您可以重新附加它然后修改它。然后提交更改。 – m4tt1mus

+0

谢谢你们真的很感谢你的帮助xD –

相关问题