在LINQ to SQL DataContext“插入”部分方法中自动递增主键

时间:2008-11-08 21:29:48

标签: linq-to-sql

我想做的是以下内容。我有一个表,Products,包含私钥ProductID。我希望在DataContext部分方法“InsertProduct”中增加它,而不是让SQL Server在插入时自动增加ProductID:

Partial Public Class MyDataContext

    Private Sub InsertProduct(ByVal instance As Product)

        Dim id As Integer = Me.Products.Max(Function(p As Product) p.ProductID) + 1
        instance.ProductID = id

        Me.ExecuteDynamicInsert(instance)

    End Sub

End Class

但是,这仅在插入第一个Product实例时有效。尝试插入第二个实例时,检索到的ID与第一个实例相同,

Using context As New MyDataContext

    Dim product1 As New Product
    context.Products.InsertOnSubmit(product1)
    context.SubmitChanges() 'This works

    Dim product2 As New Product
    context.Products.InsertOnSubmit(product2)
    context.SubmitChanges() 'DuplicateKeyException

End Using

我错过了一些明显的东西吗?

3 个答案:

答案 0 :(得分:2)

我真的建议让SQL Server进行增量编号。上述方法即使你确实工作也会在多用户场景下加载失败,在这种情况下,他们都获得相同的ID并尝试插入相同的ID。

答案 1 :(得分:0)

在上面的代码中,InsertProduct未声明为部分方法。这是你的帖子中的拼写错误还是你用不同的签名声明它,因此它没有被执行?

[编辑]我不是VB程序员(我使用C#),但我认为你的代码需要将代码声明为部分代码以及设计器代码。无论如何,这在C#中也是如此。

答案 2 :(得分:0)

InsertProduct在设计器生成的文件(MyDataClasses.designer.vb)中声明为部分方法。

它被执行,实际上我可以在InsertProduct中插入一个断点并观察为product1正确运行的所有内容。对于product2,context.SubmitChanges()抛出异常,但不会触发断点。