Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

ADO.NET Data Services: utilizzare LINQ to SQL con Visual Basic 2008 - prima parte

Finora abbiamo visto come gli ADO.NET Data Services permettano di esporre all’interno della rete (Internet/Intranet) dei dati a partire da un Entity Data Model basato su ADO.NET Entity Framework. Un EDM è sicuramente il modello a oggetti “naturale” quando si lavora coi Data Services, ma non è l’unico. Al di là del fatto che è possibile trattare anche collezioni di oggetti in memoria, è anche possibile utilizzare un modello basato su LINQ-to-SQL.

 

Esporre i dati mappati con LINQ to SQL funziona in modo essenzialmente analogo a quanto avviene con Entity Framework, tuttavia sono necessari alcuni passaggi che vedremo in due post distinti: in questo primo post vedremo come creare un ADO.NET Data Service che esponga dati provenienti da LINQ to SQL e quali sono le operazioni necessarie affinché le entità siano riconosciute e “interrogabili”. Nel secondo post, invece, vedremo quali sono i passaggi da eseguire per rendere possibile l’esecuzione di operazioni di insert/update/delete.

 

Supponiamo di voler riprogettare lo stesso servizio proposto in questo mio articolo sul Visual Basic Developer Center, in funzione di LINQ to SQL. Creiamo quindi un’applicazione Web di tipo ASP.NET in Visual Basic 2008.

Fatto questo, la prima cosa da fare è proprio l’aggiunta di una classe LINQ to SQL:

 

 

Ricorderete che è necessario trascinare, dalla finestra Server Explorer, le tabelle di interesse dal database sulla superficie del designer LINQ. Il nostro obiettivo riguarda le tabelle Customers, Orders e Order_Details. Dopo aver trascinato tali tabelle sul designer, il motore di object relational mapping di Visual Studio genera entità ed EntitySet per le rispettive tabelle ed il risultato è il seguente:

 

 

A livello di codice Visual Basic, è stata generata una classe che costituirà l’istanza del DataContext, il punto di riferimento in LINQ to SQL, chiamata NorthwindDataContext.

 

Fatto questo, aggiungiamo con le consuete modalità un elemento di tipo ADO.NET Data Service al progetto:

 

 

Quando il Data Service è stato aggiunto al progetto, passiamo al relativo codice Visual Basic. Nè più nè meno rispetto a quanto facevamo con Entity Framework, sostituiamo la dicitura [[class name]] con il nome del nostro DataContext nella dichiarazione di ereditarietà della classe DataService:

 

Public Class NorthwindDataService

    ' TODO: replace [[class name]] with your data class name

    Inherits DataService(Of NorthwindDataContext)

 

E poi assegnamo le autorizzazioni sulle entità come riteniamo opportuno (in questo caso tutte le entità hanno tutte le autorizzazioni, per brevità espositiva):

 

    ' This method is called only once to initialize service-wide policies.

    Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration)

        ' TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.

        ' Examples:

        config.SetEntitySetAccessRule("*", EntitySetRights.All)

        ' config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All)

    End Sub

End Class

 

Finora, quindi, nulla di nuovo. Ora iniziamo col lavoro “manuale”. Gli ADO.NET Data Services richiedono che una classe rappresentante l’entity da interrogare sia contrassegnata dall’attributo DataServiceKey, il cui argomento rappresenta la chiave primaria, nel caso di database, o la proprietà comune alle collezioni da interrogare.

 

Sfruttando la caratteristica delle classi parziali, possiamo evitare di toccare il codice generato da Visual Studio per la classe LINQ to SQL evitando, così, di complicarci la vita. E’ quindi sufficiente scrivere una dichiarazione di classe parziale per ciascuna delle entità e dichiararla come DataServiceKey, come nel modo seguente:

 

Imports System.Data.Services.Common

 

<DataServiceKey("CustomerID")> _

Partial Public Class Customer

End Class

 

<DataServiceKey("OrderID")> _

Partial Public Class Order

End Class

 

<DataServiceKey("OrderID", "ProductID")> _

Partial Public Class Order_Detail

End Class

 

Due cose sono importanti in questo codice: affinchè gli ADO.NET Data Services siano in grado di riconoscere le entità, la chiave primaria deve terminare con “ID”, quindi CustomerID, OrderID ecc. La seconda cosa, DataServiceKey può ricevere più argomenti; ad esempio, nel dichiarare la classe Order_Detail abbiamo specificato le due chiavi su cui si basano le relazioni che interessano la nostra entità. Se abbiamo dei dubbi al riguardo, ci basta guardare il designer di LINQ to SQL e specificare quelle proprietà per le quali c’è il simbolo della chiave.

 

Se ora proviamo ad avviare il servizio e lo interroghiamo in query string come già sappiamo fare, noteremo che le entità vengono serializzate correttamente:

 

 

Se poi siete curiosi, potete provare a rimuovere gli attributi DataServiceKey per accorgervi che all’avvio il servizio non riconoscerà le entità non decorate da tale attributo.

 

Ci fermiamo qui per ora. Nel prossimo post impareremo ad implementare l’interfaccia IUpdatable traducendo in Visual Basic una versione C# di tale implementazione disponibile sulla MSDN Code Gallery.

 

Alessandro

Print | posted on venerdì 24 aprile 2009 15:18 | Filed Under [ Visual Basic WCF Data Services/WCF RIA Services/OData ]

Powered by:
Powered By Subtext Powered By ASP.NET