I was trying to find a way to POST a new entity to an OData feed and found it hard to find examples of doing this. After a bit of searching I found some C# code that allowed me to do an update. After converting this to VB I ended up with
Private Sub addPersonButton_Click_1(sender As Object, e As RoutedEventArgs) Dim p As New Person p.name = personNameTextBox.Text If p.name <> "" Then _context.AddToPerson(p) _context.BeginSaveChanges(AddressOf ContextSaveChanges, p) End If End Sub
Person is part of an OData feed I am using e.g. http://server/odata.svc/Person
So I create a new instance of a Person and add a name to it (From a TextBox in the UI)
Then I use the AddToPerson method of the context and as there is no synchronous way in WinRT to SaveChanges, I used the BeginSaveChanges method of the context and passed through the address of the routine that will handle the callback.
Private Function ContextSaveChanges(result As IAsyncResult) As Task Try _context.EndSaveChanges(result) Catch ex As Exception _message = ex.Message If ex.InnerException IsNot Nothing Then _message = _message & " - " & ex.InnerException.Message End If Me.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, AddressOf UpdateUI) End Try End Function Public Sub UpdateUI() personNameTextBox.Text = _message End
Above is the function that gets called and it will try to run EndSaveChanges and trap any error that occurred and display it on the UI. I originally put the personNameTextBox.Text = ex.Message in the catch section but that caused a Treading error [RPC_E_WRONG_THREAD]. So after a lot of routing around and the help of a colleague I discovered the Me.Dispacher.RunAsync function in which I had a lambda expression in to update the UI. This didn’t fail but also didn’t update the UI so I used a subroutine and put the AddressOf in the RunAsync command and this worked as expected.
Phew made it 😉