违反PRIMARY KEY约束

时间:2011-07-22 20:54:28

标签: c# sql-server linq-to-sql

我正在尝试记录唯一标识符,因此我无法承担我的ID的重复记录

当我尝试更新名为Clients的SQL Server表时,我收到的错误如下所示。

  

违反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,

由于

约翰

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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();
}