C# 重复键错误,但通过LINQ插入数据时找不到具有相同值的项

C# 重复键错误,但通过LINQ插入数据时找不到具有相同值的项,c#,sql-server,database,linq,C#,Sql Server,Database,Linq,我使用C Linq与MSSQL数据库交互。我遇到一个问题,有时会收到错误消息: 违反主键约束“主键名称”。不能 在对象“dbo.table_name”中插入重复键。该声明已经发布 已经终止 当我尝试向数据库添加信息时。当错误发生时,我在MSSQL Management Studio中使用我尝试添加的值执行sql查询,但表中似乎没有条目 所以我的问题是,是否有人知道这里可能存在什么问题。以下是一些补充资料 在SaveChanges发生错误时,我运行的代码如下所示: table_name table

我使用C Linq与MSSQL数据库交互。我遇到一个问题,有时会收到错误消息:

违反主键约束“主键名称”。不能 在对象“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以及:

Microsoft SQL Server Management Studio 10.50.1600.1 Microsoft数据访问组件MDAC 6.1.7601.17514 Microsoft MSXML 3.0 5.0 6.0 Microsoft Internet Explorer 8.0.7601.17514 Microsoft.NET Framework 2.0.50727.5448 操作系统6.1.7601 更新 当我改用Create函数时,如下所示:

table_name table_name_instance = Createtable_name(col_val, col2_val,...);
context.table_name.AddObject(fps);
context.SaveChanges();

它似乎工作得很好。这是否暗示了为什么我的第一个使用new的解决方案不起作用,即使我填写了每一列的值,也不接受带有值的null?

查看此SQL语句在SQL Server上是否起作用

INSERT INTO [dbo].[table_name]
       ([col1]
       ,[col2]
       ,[col3]
       ,[col4])
VALUES
       (NEWID(),
       NEWID(),
       NEWID(),
       NEWID())
GO

如果是这样,则表示您从应用程序创建的Guid正在复制。在数据库中插入数据之前,请检查表中是否存在要插入的主键。您必须对每一列执行此操作,因为每一列都是PK。

请查看此SQL语句在SQL Server上是否有效

INSERT INTO [dbo].[table_name]
       ([col1]
       ,[col2]
       ,[col3]
       ,[col4])
VALUES
       (NEWID(),
       NEWID(),
       NEWID(),
       NEWID())
GO

如果是这样,则表示您从应用程序创建的Guid正在复制。在数据库中插入数据之前,请检查表中是否存在要插入的主键。您必须对每一列执行此操作,因为每一列都是主键。

您正在执行的插入可能包含两个重复的键值。整个插入将被中止,因此您在表中也看不到。您可以使用SQL Profiler查看LINQ正在做什么。您是否尝试过对数据库运行INSERT语句以查看从应用程序生成的INSERT语句?问题是,我一次只添加一个条目。我为每个条目添加一个AddObject,然后保存更改。我将看一看SQL Profiler,看看它是否显示了一些有趣的东西。是什么让您认为您没有插入一个已经存在的行?至少在这个调试会话中,您应该尝试对具有相同主键值的表进行查询,检查是否返回记录,然后决定是否需要插入或更新。您正在执行的插入可能包含两个重复的键值。整个插入将被中止,因此您在表中也看不到。您可以使用SQL Profiler查看LINQ正在做什么。您是否尝试过对数据库运行INSERT语句以查看从应用程序生成的INSERT语句?问题是,我一次只添加一个条目。我为每个条目添加一个AddObject,然后保存更改。我将看一看SQL Profiler,看看它是否显示了一些有趣的内容。是什么让您认为您没有插入一个已经存在的行?至少在这个调试会话中,您应该尝试使用相同的主键值对表进行查询,并检查您是否获得了一条记录,然后决定是否需要插入或更新。