WCF Dataservice CRUD Operationen

Aufbauenden auf meine vorigen Blog Eintrag verwende ich einen vorhandenen Data Service und verwende ihn, wie von Microsoft vorgesehen mit der eingebauten API (WCF Data Services Client Library). Zunächst muss im Silverlight Projekt eine Service Referenz erzeugt werden. Der Discover Button Im Dialog muss den Data Service auflisten.

image

Für das Laden der Daten muss dann eine Instanz des Service proxys erzeugt werden. Die Syntax ist gewöhnungsbedürftig.

Dim svc As ServiceReference1.NorthwindEntities = 
New ServiceReference1.NorthwindEntities(New Uri("WcfDataService1.svc", UriKind.Relative))

Dann kann eine DataserviceCollection vom Typ Customer erzeugt werden, die dann auch als LINQ Query dienen kann. So kann man z.B. nur ausgewählte Kunden Daten übertragen. Im Folgenden Beispiel werden alle Customers geholt. Natürlich ist alles wie in Silverlight Üblich Asynchron, entsprechend eine Rücksprung Methode, wenn die Daten geladen sind.

Private Sub Button1_Click(ByVal sender As System.Object, 
ByVal e As System.Windows.RoutedEventArgs) Dim c As New DataServiceCollection(Of Customers)(svc) AddHandler c.LoadCompleted, AddressOf CustomersGeladen c.LoadAsync(From p In svc.Customers Select p) End Sub

Ja dann wird einfach nur die Bindung an Itemssource des Datagrid in Silverlight ausgeführt.

 Private Sub CustomersGeladen(ByVal sender As Object, ByVal e As LoadCompletedEventArgs)
        DataGrid1.ItemsSource = sender
End Sub

Technisch kann man auch die alternativen Weg über Begin und EndExecute gehen.

svc.BeginExecute(Of ServiceReference1.Customers)_
(New Uri("Customers", UriKind.Relative), AddressOf fertig, svc) ... Public Sub fertig(ByVal result As IAsyncResult) DataGrid1.ItemsSource = svc.EndExecute(Of ServiceReference1.Customers)(result).ToList End Sub

Das Ergebnis ist in diesem Fall das gleiche.

image

Im nächsten Schritt werden die Daten gespeichert. Dies hat für mich schon den Hauch der Magie.

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
svc.BeginSaveChanges(SaveChangesOptions.Batch, AddressOf saveFertig, svc) End Sub Public Sub saveFertig(ByVal result As IAsyncResult) svc.EndSaveChanges(result) End Sub

Es werden in der Tat nur die geänderten Entiäten zum Server übermittelt, wie man aus dem Fiddler Mitschnitt entnehmen kann.

image

Nun wird ein neuer Kunde erzeugt. Das Datagrid ist dafür nicht geeignet, weil ihm der Insert Mode fehlt. Einen Mögliche Lösung ist ein Childwindow als Insert Formular verwenden. In diesem Silverlight Beispiel kürze ich das ab und erzeuge zu Demonsrtation im Code ein Objekt.

Dim o As New Customers
o.CustomerID = "ppedv"
o.CompanyName = "ppedv AG"
svc.AddObject("Customers", o)
svc.BeginSaveChanges(SaveChangesOptions.Batch, AddressOf saveFertig, o)

Wenn man die Logik verstanden hat ist das Löschen auch ganz einfach. Entity besorgen, entsorgen und update asynchron durchführen.

svc.DeleteObject(DataGrid1.SelectedItem)
svc.BeginSaveChanges(SaveChangesOptions.Batch, AddressOf saveFertig, svc)

weitere Infos dazu

http://www.microsoft.com/germany/msdn/solve/knowhow/howto/cliententwicklung/WieKannIchWCFDataServicesInEinerSilverlightAnwendungBenutzen.mspx

http://www.microsoft.com/germany/msdn/solve/codeclips/library.aspx?id=msdn_de_39672

Kommentar schreiben