Возврат ID из LINQ после нескольких подключений / вставки

У меня есть суб, который принимает много значений и обновляет/создает записи в базе данных по мере необходимости.

Public Sub BatchChange(ByVal Updated As List(Of Article), ByVal Created As List(Of Article), ByVal Deleted As List(Of Article), ByVal UserId As Integer)

        Dim d As DateTime = Now

        For Each Art As Article In Deleted
            Art.Deleted = True
            Art.ChangeDate = d
            Art.ChangeCount += 1
            DB.Articles.Attach(A, True)
        Next

        For Each Art As Article In Created
            Art.ChangeDate = d
            Art.ChangeCount = 1
            Art.ModifierUserId = UserId
            DB.Articles.InsertOnSubmit(A)

            Next

            For Each Art As Article In Updated
                Art.ChangeDate = d
                Art.ChangeCount += 1
                Art.ModifierUserId = UserId
                DB.Articles.Attach(A, True)

            Next

        DB.SubmitChanges()

End Sub

Теперь это, в свою очередь, должно быть синхронизировано с другой базой данных через REST-API, и моя текущая проблема с каждым в «созданной» модели.

    Public Sub BatchChange(ByVal Updated As List(Of Article), ByVal Created As List(Of Article), ByVal Deleted As List(Of Article), ByVal UserId As Integer)

        Dim d As DateTime = Now
        Dim SyncList As New List(Of SyncParam)

        For Each A As Article In Deleted
            A.Deleted = True
            A.ChangeDate = d
            A.ChangeCount += 1
            DB.Articles.Attach(A, True)
            SyncList.Add(New SyncParam(A.ClientId, A.ArticleId))
        Next

        For Each A As Article In Created
            A.ChangeDate = d
            A.ChangeCount = 1
            A.ModifierUserId = UserId
            DB.Articles.InsertOnSubmit(A)
            SyncList.Add(New SyncParam(A.ClientId, A.ArticleId))
            Next

            For Each A As Article In Updated
                A.ChangeDate = d
                A.ChangeCount += 1
                A.ModifierUserId = UserId
                DB.Articles.Attach(A, True)
            SyncList.Add(New SyncParam(A.ClientId, A.ArticleId))
            Next

        DB.SubmitChanges()

        For Each Value In SyncList
            API.Util.APISync(Value.ClientId, Value.ArticleId)
        Next

    End Sub

И мне нужен созданный ID для статьи, поэтому я зацикливаюсь на списке после DB.SubmitChanges в тщетной надежде получить его, а затем синхронизировать его с другой базой данных.

Но, по-видимому, этот способ невозможен, он продолжает жаловаться, что строка была изменена/изменена или удалена, что я предполагаю, что это было, так как LINQ обновил значения.

Как я могу пройтись по списку (с измененными значениями) без жалоб VB Net?

1 ответ

  1. Я обнаружил, что созданный объект содержит идентификатор после DB.SubmitChanges поэтому ответ должен был сделать новый для каждого цикла после этого и вытащить ID

    Public Sub BatchChange(ByVal Updated As List(Of Article), ByVal Created As List(Of Article), ByVal Deleted As List(Of Article), ByVal UserId As Integer)
    
        Dim d As DateTime = Now
        Dim SyncList As New List(Of SyncParam)
    
        For Each A As Article In Deleted
            A.Deleted = True
            A.ChangeDate = d
            A.ChangeCount += 1
            DB.Articles.Attach(A, True)
            SyncList.Add(New SyncParam(A.ClientId, A.ArticleId))
        Next
    
        For Each A As Article In Created
            A.ChangeDate = d
            A.ChangeCount = 1
            A.ModifierUserId = UserId
            DB.Articles.InsertOnSubmit(A)
            Next
    
            For Each A As Article In Updated
                A.ChangeDate = d
                A.ChangeCount += 1
                A.ModifierUserId = UserId
                DB.Articles.Attach(A, True)
            SyncList.Add(New SyncParam(A.ClientId, A.ArticleId))
            Next
    
        DB.SubmitChanges()
    
        For Each A as Article in Created
           SyncList.Add(New SyncParam(A.ClientId, A.ArticleId))
        Next
    
        For Each Value In SyncList
            API.Util.APISync(Value.ClientId, Value.ArticleId)
        Next
    
    End Sub