违反 PRIMARY KEY 约束
Posted
技术标签:
【中文标题】违反 PRIMARY KEY 约束【英文标题】:Violation of PRIMARY KEY constraint 【发布时间】:2011-07-22 20:54:28 【问题描述】:我正在尝试记录唯一标识符,因此我无法承受我的 ID 的重复记录
当我尝试更新名为 Clients
的 SQL Server 表时,我收到了一个类似这样的错误。
违反主键约束“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,如果它不存在提交新的客户端 ID + URI,
谢谢
约翰
【问题讨论】:
【参考方案1】:您要做的是首先检查现有记录,如果不存在,然后添加一个新记录。您的代码将始终尝试添加新记录。我假设您使用的是 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();
【讨论】:
感谢 Joel,这是一个很好的例子,让弄清楚如何集成变得更加容易,有了这样的例子就让我的生活更轻松了哈哈 与您的评论相反 - Linq2Sql 确实支持 SingleOrDefault,在这种情况下使用它是合适的 我的错误,看起来我将 Linq2Sql 与最早版本的 Entity Framework 混淆了。我已经更新了我的示例。【参考方案2】:您需要获取现有 对象并更新其uri
属性,然后调用clientDB.SubmitChanges()
。您现在拥有的代码非常明确地要求它插入一条新记录。
大概这样的事情会起作用:
using (clientsDBDataContext clientDB = new clientsDBDataContext())
var client = clientDB.clientURIs.Where(c => c.clientID == clientID).Single();
client.uri = uri.ToString();
clientDB.SubmitChanges();
【讨论】:
或者,如果您的对象处于旧状态,您可以重新附加它然后对其进行修改。然后提交更改。 谢谢大家非常感谢您的帮助 xD以上是关于违反 PRIMARY KEY 约束的主要内容,如果未能解决你的问题,请参考以下文章
交叉应用和外部应用一起使用时违反 PRIMARY KEY 约束
违反 PRIMARY KEY 约束“PK_Address”。等等......我做错了啥?
违反 PRIMARY KEY 约束“PK_EMPLOYEE”。无法在对象中插入重复键