Silverlight 4 e WCF RIA Services : esempio di relazione master-detail

[Aggiornato con codice anche in Visual Basic]

In questo post vedremo come realizzare un semplice esempio per implementare una relatione master-detail usando Silverlight 4 e i WCF RIA Services, entrambe le tecnologie non ancora rilasciate.

Per realizzare l’esempio dovete installare

  • Visual Studio 2010 (beta 2 al momento)
  • Silverlight 4 (beta) che contiene la Technical Preview dei WCF RIA Serives

Creazione del progetto per una Business Application

Inzialmente partiamo realizzando un’applicazione Silverlight, anche se non strettamente necessario possiamo usare il template Silverlight per realizzare applicazioni di business. Per usarlo da Visual Studio 2010, selezionare “New Projects”, quindi “Silverlight” e selezionare Silverlight Business Application, come mostrato in figura

image

Questo template ci consente di avere un template già fatto che offre questi vantaggi:

  • aspetto professionale
  • un framework di navigazione per l’applicazione integrato con i bottoni di back and forward funzionante da diversi browser: Internet Explorer, Safari, FireFox e Chrome.
  • Proprietà dei controlli della UI già integrati con il file delle risorse per una facile localizzazione
  • integrazione con il provider di memership di ASP.NET per l’autenticazione e gestione dei ruoli

Nel nostro caso andremo a personalizzare la pagina Home.xaml che si trova nel folder Views, ma potete aggiungere un’altra pagina Silverlight facilmente al framework di navigazione.

Creazione del DAL usando Entity Framework

Aggiungiamo ora al progetto un ADO.NET Entity Data Model, per creare il nostro DAL, nel mio caso l’ho chiamato NorthwindModel.edmx e ho aggiunto, usando il database northwind, la tabella Customers e Orders, per avere una semplice relazione 1-a-molti che mi servirà per creare la UI con la relazione master-details. Inoltre nel designer ho rinominato le due classi create togleindo la “s” finale. Quindi il mio modello dei dati avrà la classe Customer e la classe Order, senza “s” . Quersto mi permette di avere collezioni di oggetti che invece avranno la “s” finale. Ovviamente questa è una finezza e non strettamente necessaria.

Nella figura seguente vedete la selezione delle due tabelle dal designer di Entity Framework

image

Che generano quindi le due classi. Nella figura seguente vedete il risultato con le due entità già rinominate.

image 

Creazione del servizio con i WCF RIA Services

Aggiungiamo ora un nuovo item che realizzerà lo strato di servizio con i RIA Services. Add-> New Items… e selezioniamo il template per Domain Service Class.

image

Questo mostrerà un popup nel quale dobbiamo indicare se le entità che verrano create saranno accedibili dal client, quali entità di quelle presenti vogliamo utilizzare, se vogliamo fare operazioni di modifica, oltre che di lettura.

image

Questo wizard genera il file NorthwindDomainService.cs dove troviamo il codice del servizio e in particolare i metodi per ottenere la lista dei nostri Customer come GetCustomers che ritorna un valore di tipo IQueryable del tipo Customer. In questo caso l’implementazione del nostro servizio è fatta sfruttando la classe LinqToEntityDomainServices messa a disposizione dal framework e che Visual Studio 2010 mi consente di sfruttare a pieno tramite il wizard.

image

Dato che ho chiesto al wizard di utilizzare anche l’entità Order, nel progetto troverete anche i corrispondenti metodi per la gestione.

Nel nostro caso però lo scenario che vogliamo indirizzare è leggermente più complesso: infatti vogliamo mostrare due griglie la prima legata ai clienti e la seconda agli ordini di uno specifico cliente una volta selezionato questo nella prima griglia.

Per questo aggiungiamo un metodo per recuperare gli ordini, metodo che accetterà un parametroche rappresenta l’id del nostro customer.

image 

il codice da aggiungere per chi usa Visual Basic.NET 2010 è il seguente

image

Grazie ai RIA Service e il template di progetto di Visual Studio 2010 ci troviamo, dopo la compilazione, il modello ad oggetti esposto sul server, direttamente sul client e tutte le operazioni di comunicazione vengono gestite per me dal framework.

Creazione della User Interface

Per la UI ho posizionato due DataGrid, una (customerDataGrid) che conterrà la lista dei customer e la seconda (orderDataGrid) gli ordini selezionati per lo specifico customer. Per fare questo ho intercettato l’evento SelectionChanged sulla prima DataGrid, per aggiungere del codice in cs, come vedrete nel seguito.

Inizialmente ho usato il drag-and-drop offerto da Visual Studio 2010, usando la finestra Data Source e trascinando l’oggetto Customer, questo mi ha aggiunto sia la DataGrid che l’oggetto DomainDataSource corrispondente. Inoltre ho poi aggiunto una seconda DataGrid che dovrà contenere gli ordini.

In figura seguente vedete più o meno il risultato nel designer di Visual Studio 2010:

image

Aggiungo ora l’evento SelectionChanged alla DataGrid customerDataGrid e aggiungo il codice per riempire la seconda (orderDataGrid nell’esempio) facendo la query verso il metodo GetOrdersByCustomerID, visto prima, aggiunto lato server e che mi trovo ora sul client grazie a RIA Services. Il metodo lato client, si chiama come la sua controparte sul server, con in più l’estensione finale di Query.

image 

Il codice in Visual Basic corrispondente è:

image

Lanciando ora l’applicazione abbiamo il comportamento desiderato: seleziono un customer nella prima DataGrid e vedo nella seconda gli ordini, come vedete nella figura sottostante.

image

Download esempio

Potete scaricare il codice d’esempio da

Buon divertimento con Silverlight 4 e i WCF RIA Services !

Comments

  • Anonymous
    March 10, 2010
    Salve, è possibile utilizzare SQL Server compact edition e utilizzare l'applicazione in OOB mode? Grazie.

  • Anonymous
    March 10, 2010
    no al momento no, a meno di implementare qualche comuncazone locale tra l'appicazione OOB ed un servizio... ma non penso sa quello che cerchi anche per i problemi di delploy sul cient

  • Anonymous
    March 10, 2010
    come database embedded da utilizzare con SL4, cosa posso usare?

  • Anonymous
    March 15, 2010
    Ciao, come faccio a gestire l'eccezione generata da un inserimento in una tabella di un record con lo stesso valore di un'altra? Mi spiego meglio: ho la tabella Categoria con campo Id di tipo int (chiave primaria) e Descrizione varchar (indice univoco). Sull'inserimento di un record con una descrizione esistente, verrebbe generata una eccezione. Come faccio a gestire questa eccezione con SilverLight + WPF Ria Services + Dataform? La devo gestire lato server o client? Spero di essere stato chiaro. Ciao e grazie!!!