Автоматически увеличивать первичный ключ в частичном методе «Вставить» в LINQ to SQL Data Вставить - PullRequest
3 голосов
/ 09 ноября 2008

Я хотел бы сделать следующее. У меня есть одна таблица Products, содержащая закрытый ключ ProductID. Вместо автоматического увеличения ProductID SQL Server на вставках я хочу увеличить его в частичном методе DataContext «InsertProduct»:

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

Однако это будет работать только при вставке первого экземпляра продукта. При попытке вставить второй экземпляр, полученный идентификатор совпадает с первым,

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 ]

2 голосов
/ 09 ноября 2008

Я бы действительно рекомендовал разрешить SQL Server делать инкрементную нумерацию. Приведенный выше подход, даже если он работает, завершится с ошибкой под нагрузкой в ​​многопользовательском сценарии, когда они оба получают одинаковый идентификатор и пытаются вставить один и тот же.

0 голосов
/ 09 ноября 2008

InsertProduct объявлен как частичный метод в сгенерированном дизайнером файле (MyDataClasses.designer.vb).

Это выполнено, фактически я могу вставить точку останова в InsertProduct и наблюдать, как все работает правильно для product1. Для product2 исключение выдается context.SubmitChanges(), но точка останова не достигается.

0 голосов
/ 09 ноября 2008

InsertProduct не объявлен как частичный метод в коде выше. Это опечатка в вашем сообщении или вы объявили ее с другой подписью, чем требуется, и поэтому она не выполняется?

[EDIT] Я не программист VB (я использую C #), но я думаю, что ваш код должен объявлять код как частичный, так и в конструкторе. В любом случае это верно в C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...