我正在使用C#Linq与MSSQL数据库进行交互。我有一个问题,我有时会收到错误消息:
“违反PRIMARY KEY约束'PK_clustered_key_name'。不能 在对象'dbo.table_name'中插入重复键。声明有 已被终止。“
当我尝试向数据库添加信息时。发生错误时,我在MSSQL Management Studio中使用我尝试添加的值执行sql查询,并且表中似乎没有条目。
所以我的问题是,如果有人对这里的问题有什么了解。其他一些信息如下。
我运行的代码(错误发生在SaveChanges
)如下:
table_name table_name_instance = new table_name();
...
fill in values of fps
...
context.table_name.AddObject(fps);
context.SaveChanges();
我还添加了一个检查col1,col2,col3,col3的值是否已存在于数据库中,因此我绝对不会添加重复的条目。因为我不确定添加是否被延迟并且检查返回已经存在重复条目我已经在本地容器中存储了添加的值以确保,但是在调用SaveChanges()时我仍然得到错误。
我的表的定义包含报告错误的聚簇键。 Col1到col4都是Guid:s,它们是其他表的外键。
CREATE TABLE [dbo].[table_name](
[col1] [uniqueidentifier] NOT NULL,
[col2] [uniqueidentifier] NOT NULL,
[col3] [uniqueidentifier] NOT NULL,
[col4] [uniqueidentifier] NOT NULL
CONSTRAINT [PK_forbandsscenariokrav] PRIMARY KEY CLUSTERED
(
[col1] ASC,
[col2] ASC,
[col3] ASC,
[col4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我看过很多类似的问题,但没有找到适合我情况的答案。
其他信息,我在Win 7 64位下使用MSSQL server 2008 R2以及:
更新
当我改为使用这样的Create函数时:
table_name table_name_instance = Createtable_name(col_val, col2_val,...);
context.table_name.AddObject(fps);
context.SaveChanges();
似乎工作得很好。这是否提供了任何暗示为什么我的第一个新解决方案无法正常工作,即使我填写了每个列值,而不是接受带值的null?
答案 0 :(得分:0)
查看此SQL语句是否适用于您的SQL Server
INSERT INTO [dbo].[table_name]
([col1]
,[col2]
,[col3]
,[col4])
VALUES
(NEWID(),
NEWID(),
NEWID(),
NEWID())
GO
如果确实如此,则表示您从应用中创建的Guid正在重复。在数据库中插入数据之前,请检查表中是否存在要插入的主键。您必须为每列执行此操作,因为每列都是PK。