Asp.net LINQ:无法在对象';dbo.tblOutstandingCompletions&x27;具有唯一索引

Asp.net LINQ:无法在对象';dbo.tblOutstandingCompletions&x27;具有唯一索引,asp.net,sql-server,linq,Asp.net,Sql Server,Linq,我有一个应用程序(ASP.NET 3.5),允许用户在需要时重新运行特定进程。该过程将记录插入MS SQL表中。我在Try/Catch中插入了insert,如果记录已经存在,则忽略Catch(标题中的错误将是有效的)。这在使用ADO时非常有效,但在我转换到LINQ后,我注意到一件有趣的事情。如果在重新运行流程时,表中已有记录,则即使没有现有记录,也会拒绝任何新记录,并出现相同的错误。 代码如下: Dim ins = New tblOutstandingCompletion

我有一个应用程序(ASP.NET 3.5),允许用户在需要时重新运行特定进程。该过程将记录插入MS SQL表中。我在Try/Catch中插入了insert,如果记录已经存在,则忽略Catch(标题中的错误将是有效的)。这在使用ADO时非常有效,但在我转换到LINQ后,我注意到一件有趣的事情。如果在重新运行流程时,表中已有记录,则即使没有现有记录,也会拒绝任何新记录,并出现相同的错误。 代码如下:

            Dim ins = New tblOutstandingCompletion
            With ins
                .ControlID = rec.ControlID
                .PersonID = rec.peopleID
                .RequiredDate = rec.NextDue
                .RiskNumber = 0
                .recordType = "PC"
                .TreatmentID = 0
            End With

            Try
                ldb.tblOutstandingCompletions.InsertOnSubmit(ins)
                ldb.SubmitChanges()
            Catch ex As Exception
                ' An attempt to load a duplicate record will fail
            End Try
在页面加载期间设置了数据库的DataContext

我通过在每次插入之前重新定义DataContext解决了问题:

        ldb = New CaRMSDataContext(sessionHandler.connection.ToString)
        Dim ins = New tblOutstandingCompletion
虽然我已经解决了这个问题,但我想知道是否有人能解释它。如果没有DataContext重新定义,那么如果没有重复记录,应用程序就可以完美地工作

问候
James

听起来DataContext认为记录是第一次插入的,因此如果不重新定义上下文,它会拒绝第二次插入,因为它“知道”记录已经存在。重新定义上下文迫使它实际检查数据库,看看它是否在那里,而不是在那里。这就是LINQ试图保存到数据库的往返行程。在您创建新上下文时,会强制它重置它“知道”的数据库信息。

我在代码中看到了一个非常类似的问题,即标识列不是自动递增的int列,而是默认值为newguid()的GUID-基本上,LINQ不允许数据库创建GUID,而是插入GUID.Empty,第二次(或以后)尝试将(正确地)抛出此错误

最后,我确保在插入过程中我自己生成了一个新的GUID。更多详情请参见此处:

这允许我插入具有相同DataContext的多个记录


另外,您是否尝试过多次调用InsertOnSubmit(每个新记录一次),但只调用SubmitChanges一次?

gfrizzle似乎就在这里

即使我刚刚运行了一个存储过程来截断数据库上的表,我的代码也会失败,并出现重复键错误。就数据上下文所知,上一次插入具有相同键的记录实际上是一个重复键,并引发异常

我找到的唯一解决办法是:

        db = null;
        db = new NNetDataContext();

就在执行先前InsertOnSubmit请求的SubmitChanges()调用之后。看起来有点傻,但这是唯一对我有效的方法,而不是重新设计代码。

表中的主键是什么?听起来您在请求期间插入了两次记录…主键是一个指定了IsIdentity的整数。文件上的另一个索引由5个字段组成。尝试添加的记录绝对是唯一的。我在两个不同版本的数据库上用完全不同的数据尝试了相同的应用程序,得到了相同的结果。