Нарушение ограничения PRIMARY KEY - PullRequest
1 голос
/ 23 июля 2011

Я пытаюсь записать уникальные идентификаторы, поэтому я не могу позволить себе дубликат записи моих идентификаторов

Я получаю сообщение об ошибке, похожее на это, при попытке обновить таблицу 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,

Спасибо

John

Ответы [ 2 ]

4 голосов
/ 23 июля 2011

Что вы хотите сделать, это сначала проверить существующую запись, и, если она не существует, , а затем добавить новую.Ваш код всегда будет пытаться добавить новую запись.Я предполагаю, что вы используете 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 голосов
/ 23 июля 2011

Вам необходимо получить существующий объект и обновить его свойство uri, а затем вызвать clientDB.SubmitChanges(). Код, который у вас есть сейчас, довольно явно просит вставить новую запись.

Предположительно что-то вроде этого будет работать:

using (clientsDBDataContext clientDB = new clientsDBDataContext()) {
    var client = clientDB.clientURIs.Where(c => c.clientID == clientID).Single();
    client.uri = uri.ToString();
    clientDB.SubmitChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...