2016-11-03 1 views
0

私は、多くの値をとり、必要に応じてデータベース内のレコードを更新/作成するSubを持っています。複数のアタッチ/挿入後のLINQからの戻り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 

     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 

そして、私は他のデータベースとそれを同期するし、それを検索しての無駄を期待してDB.SubmitChanges後にリストをループしてるので、私は記事のために作成したIDが必要です。

しかし、明らかにこの方法は不可能です。LINQが値を更新して以来、行が変更/削除されていると不平を言っています。

どのように私はVBネット不満なしで(変更された値で)リストをループすることができますか?答えはその後の各ループのための新しいを作成し、IDを引っ張っていたので、

答えて

0

は、私が作成したオブジェクトが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