我想做的是以下内容。我有一个表,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
我错过了一些明显的东西吗?
答案 0 :(得分:2)
我真的建议让SQL Server进行增量编号。上述方法即使你确实工作也会在多用户场景下加载失败,在这种情况下,他们都获得相同的ID并尝试插入相同的ID。
答案 1 :(得分:0)
在上面的代码中,InsertProduct未声明为部分方法。这是你的帖子中的拼写错误还是你用不同的签名声明它,因此它没有被执行?
[编辑]我不是VB程序员(我使用C#),但我认为你的代码需要将代码声明为部分代码以及设计器代码。无论如何,这在C#中也是如此。
答案 2 :(得分:0)
InsertProduct在设计器生成的文件(MyDataClasses.designer.vb)中声明为部分方法。
它被执行,实际上我可以在InsertProduct中插入一个断点并观察为product1正确运行的所有内容。对于product2,context.SubmitChanges()
抛出异常,但不会触发断点。