首页 文章

违反PRIMARY KEY约束

提问于
浏览
1

我正在尝试记录唯一标识符,因此我无法承担我的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 回答

  • 4

    您要做的是首先检查现有记录,如果它不存在,则添加一个新记录 . 您的代码将始终尝试添加新记录 . 我'm assuming you'重新使用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();
        }
    }
    
  • 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();
    }
    

相关问题