首页 文章

使用Identity(1,1)违反PRIMARY KEY约束

提问于
浏览 262
0

我一直在努力解决一个不一致的问题,我希望能解决这个问题 . 在随机时间我的系统将有一组4-5个INSERTS由于以下原因而失败:

违反PRIMARY KEY约束'PK_Quality_Checks' . 无法在对象'dbo.Quality_Checks'中插入重复键 . 重复键值为(25943) .

我读过这个错误的大多数其他问题涉及使用除了 Identity(1,1) 之外的其他东西作为PK,或者非常特殊的情况,所以我发布了我自己的问题 .

我正在使用Entity Framework来处理我的SQL Server 2012数据库 . 我将一个XML文件解析为一个名为 Test_Run 的对象,然后将该对象转换为我的Entity对象以添加到表中 .

所有表都使用 Identity(1,1) 作为主键 .

我的转换代码:

public static int SaveTestRun(TestRun testRun)
{
        gReportEntities gReportEntity = new gReportEntities();
        var testRunTable = new Test_Runs()
        {
            TRX_Name = testRun.TrxFile,
            Start_Time = testRun.StartTime,
            Enviroment = testRun.Environment,
            Mach_Config = testRun.MachineConfiguration,
            Product = testRun.Product,
            Details = testRun.Details,
            Duration = testRun.Duration.ToString(),
            End_Time = testRun.EndTime,
            Failed_Num = testRun.FailedTestCount,
            Passed_Num = testRun.PassedTestCount,
            Incom_Num = testRun.IncompleteTestCount,
            Abort_Num = testRun.AbortedTestCount,
            NotEx_Num = testRun.NotExecutedTestCount,
            Timed_Num = testRun.TimedOutTestCount,
            QC_Failed_Num = testRun.FailedQualityChecksCount,
            QC_Passed_Num = testRun.PassedQualityChecksCount,
            QC_Incon_Num = testRun.InconclusiveQualityChecksCount,
            Video_Dir = testRun.VideoRootPath,
            Custom_Html = testRun.CustomHtml

        };

        foreach (var test in testRun.Tests)
        {
            var testResult = new Test_Results()
            {
                Test_Class = test.Value.TestClass,
                Test_Name = test.Value.Name,
                Result = test.Value.Outcome.ToString(),
                Start_Time = test.Value.StartDate,
                Guid = test.Value.Id,
                Duration = test.Value.Duration.ToString(),
                Category = String.Join(", ", test.Value.Categories),
                Error_Message = test.Value.ErrMessage,
                Stack_Trace = test.Value.StackTrace,
                Video_Link = test.Value.VideoPath,
                Comment = test.Value.Comment
            };

            foreach (var qCheck in test.Value.QualityChecks)
            {
                var qualityCheck = new Quality_Checks()
                {
                    Check_Name = qCheck.Name,
                    Check_Outcome = qCheck.Outcome.ToString(),
                    Message = qCheck.Message
                };
                testResult.Quality_Checks.Add(qualityCheck);
            }

            testRunTable.Test_Results.Add(testResult);
        }

        gReportEntity.Test_Runs.AddObject(testRunTable);

        gReportEntity.SaveChanges();

        return testRunTable.Test_Run_Id;
}

我需要修复此问题,否则我的工具无法完全实现 .

1 回答

  • 2

    通常,如果标识列违反了键约束,那是因为某些内容已添加到您的表中,其ID高于其当前播种的值 . 所以当你去插入一个新值时,它会发现已经有一个带有该ID的条目 .

    你可能想要reseed your identity column .

相关问题