Implementazione del servizio Web Books Authors (applicazione di esempio EDM)

L'esempio relativo al servizio Web Books Authors discusso in questo gruppo di argomenti implementa un'applicazione Entity Data Model (EDM) dagli schemi dell'argomento Schemi del servizio Web Books Authors (applicazione di esempio EDM).

Lo spazio dei nomi e le classi utilizzati dal servizio Web Books Authors sono compilati in base alle entità e alle associazioni progettate in CSDL (Conceptual Schema Definition Language). Le tabelle di database in cui sono archiviati i dati per le classi sono descritte dai metadati scritti in SSDL (Store Schema Definition Language). I tipi nello schema di progettazione sono mappati ai metadati dell'archivio in MSL (Mapping Specification Language).

Il modello a oggetti programmabile dipende sia dagli schemi che dalla specifica di mapping. Il modello a oggetti è compilato in base allo schema concettuale. Affinché sia possibile stabilire una connessione dell'entità, la DLL risultante richiede che lo schema concettuale e quello di archiviazione, nonché la specifica di mapping, si trovino nell'ambito.

La definizione di un oggetto EntityConnection rende disponibili per il codice le classi e l'origine dati. Per ulteriori informazioni sulla compilazione della libreria di classi, vedere Implementazione di entità (EDM).

Progetto di servizio Web

Il servizio Web che utilizza il modello a oggetti Books Authors descritto in questa sezione viene implementato come progetto separato. Creare un progetto basato sul modello Servizio Web ASP.NET. Aggiungere riferimenti alla DLL System.Data.Entity e alla DLL BooksAuthors create nel progetto di oggetto modello EDM. Quando vengono aggiunti i riferimenti viene creata una cartella bin che contiene le DLL.

Gli schemi devono trovarsi nell'ambito dell'eseguibile. Aggiungere gli schemi dal progetto Libreria di classi BooksAuthors alla cartella App_Data nel progetto di servizio Web.

Web.config

Un file Web.config è necessario per individuare gli schemi, i metadati e il server dei dati utilizzati dagli oggetti EDM nel servizio Web BooksAuthors. Nel codice XML seguente è illustrato il file Web.config per il servizio. La stringa di connessione identifica il server e il database utilizzati dalla specifica di mapping per stabilire una connessione tra le classi programmabili e il database.

<?xml version="1.0"?>
<configuration>

    <configSections/>

    <system.web>
        <authentication mode="Windows"/>
        <identity impersonate ="true"/>
    </system.web>

    <connectionStrings>
        <add name="BooksAuthorsEntities"
         connectionString=
         "metadata=C:\Inetpub\wwwroot\BooksAuthorsWebSrv\App_Data\;
         provider=System.Data.SqlClient; 
         provider connection string='server=serverName; 
         database=BooksAuthors; 
         integrated security=true;
         multipleactiveresultsets=true'" 
         providerName="System.Data.EntityClient"/>
    </connectionStrings>
</configuration>
NoteNota

Questa stringa di connessione imposta i servizi MARS (Multiple Active Result Set) su true, come richiesto per richiamare il metodo Load sulle associazioni quando un altro lettore dati è già aperto nella stessa connessione.

Quando il servizio è in esecuzione in un server Web, deve individuare il percorso degli schemi da una directory virtuale. A tale scopo, è possibile utilizzare il metodo Server.MapPath nel file global.asax. Nel codice seguente tramite il metodo MapPath viene individuato il percorso assoluto completo. Il percorso individuato da MapPath viene sostituito nella stringa di connessione ottenuta dal file Web.config.

Le routine vengono illustrate dopo il metodo Application_Start nel file global.asax riportato immediatamente sotto.

  <script >

    void Application_Start(object sender, EventArgs e) 
    {
        String connString = 
          System.Web.Configuration.WebConfigurationManager.
          ConnectionStrings["BooksAuthorsEntities"].ConnectionString;

        connString = connString.Replace(@"C:\Inetpub\wwwroot\BooksAuthorsWebSrv\App_Data\",
         Server.MapPath("~/App_Data"));

        Application.Contents.Add("ConnString", connString);

    }

  </script>

Nelle dichiarazioni Web Method la stringa di connessione modificata viene letta dall'insieme Application.Contents e utilizzata per creare un'istanza del contesto dell'oggetto come indicato di seguito: BooksAuthorsEntities db = new BooksAuthorsEntities(Application.Contents["ConnString"] as String).

Codice dell'applicazione

L'esecuzione di una connessione dell'entità dipende dalla stringa di connessione nel file Web.config e dal codice nel costruttore del servizio Web. Poiché la stringa di connessione è archiviata nel file Web.config, la connessione può essere stabilita in una riga di codice: BooksAuthors db = new BooksAuthors(Application.Contents["ConnString"] as String)). Tramite questo servizio Web la connessione dell'entità viene inizializzata separatamente in ogni metodo fornito dal servizio. In SQL Server viene utilizzato un pool di connessioni per non influire sulle prestazioni.

I metodi del servizio Web in questa applicazione vengono implementati come metodi pubblici che inizializzano e restituiscono List<T>. Gli elenchi vengono convertiti in testo dai protocolli dei servizi Web e restituiti come dati XML.

Il primo metodo restituisce tutte le entità Books presenti nel sistema. Per recuperare i dati di Books, viene aperta per il servizio Web una connessione ai dati di BooksAuthors. Un nuovo oggetto List<T> di tipo Books viene inizializzato e utilizzato per convertire Query<T> di Books in una matrice che può essere restituita al chiamante del metodo. La connessione viene quindi chiusa.

    [WebMethod]
    public Books[] GetBooks()
    {
        using (BooksAuthorsEntities db =
            new BooksAuthorsEntities(
                Application.Contents["ConnString"] as String))
        {
            List<Books> bookList = new List<Books>(db.Books);
            return bookList.ToArray();
        }
    }

Il metodo successivo funziona nello stesso modo per restituire Authors.

    [WebMethod]
    public Authors[] GetAuthors()
    {
        using (BooksAuthorsEntities db =
            new BooksAuthorsEntities(
                Application.Contents["ConnString"] as String)) 
        {
            List<Authors> authorsList = new List<Authors>(db.Authors);
            return authorsList.ToArray();
        }
    }

Nel metodo seguente viene utilizzata una query con parametri sul titolo del libro per individuare tutte le entità BooksInfo in cui la proprietà BookTitle è uguale al titolo fornito. Utilizzando queste entità BooksInfo, è possibile eseguire la navigazione dell'associazione tra le entità Authors e le entità BooksInfo per accedere a tutte le entità Authors associate al libro con il titolo specificato.

Una matrice di tipo Authors viene restituita al chiamante del metodo.

    [WebMethod]
    public Authors[] GetAuthorsFromBookTitle(string bookTitle)
    {
        using (BooksAuthorsEntities db =
            new BooksAuthorsEntities(
                Application.Contents["ConnString"] as String))
        {
            ObjectParameter param = new ObjectParameter("p", bookTitle);

            List<Authors> authorsList = new List<Authors>();

            foreach (BooksInfo bksInfo in db.BooksInfo.Where(
                "it.BookTitle = @p", param))
            {
                bksInfo.AuthorsReference.Load();
                authorsList.Add(bksInfo.Authors);

            }
            return authorsList.ToArray();
        }
    }

Il metodo GetBooksFromAuthorLastName funziona come il metodo precedente per restituire una matrice di libri in base a una query sul cognome di un autore.

    [WebMethod]
    public Books[] GetBooksFromAuthorLastName(string authorLastName)
    {
        using (BooksAuthorsEntities db =
            new BooksAuthorsEntities(
                Application.Contents["ConnString"] as String))
        {
            ObjectParameter param = new ObjectParameter("p", authorLastName);

            List<Books> booksList = new List<Books>();

            foreach (BooksInfo bksInfo in db.BooksInfo.Where(
                "it.AuthorLastName = @p", param))
            {
                bksInfo.BooksReference.Load();
                booksList.Add(bksInfo.Books);
            }
            return booksList.ToArray();
        }
    }

Questo servizio Web può essere utilizzato anche per aggiungere entità Books, nonché l'autore o gli autori del libro aggiunto. La connessione dell'entità può essere utilizzata per scrivere i dati e per leggerli. Il metodo Web seguente consente di creare entità che rappresentano un libro e il relativo autore, di aggiungere le entità a ObjectContext e di aggiornare il database. Il metodo può essere utilizzato il numero di volte necessario per aggiungere ulteriori autori per lo stesso titolo.

    [WebMethod]
    public void AddBook(string title, string authorFirstName,
        string authorLastName, string infoUri, string isbnNumber)
    {
        using (BooksAuthorsEntities db =
            new BooksAuthorsEntities(
                Application.Contents["ConnString"] as String))
        {

            BooksInfo newBooksInfo = new BooksInfo();
            newBooksInfo.BookInfoId = Guid.NewGuid();
            newBooksInfo.AuthorLastName = authorLastName;
            newBooksInfo.BookTitle = title;
            if (!infoUri.Equals(""))
                newBooksInfo.InfoLocator = infoUri;

            Books existingBook = null;
            ObjectParameter param = new ObjectParameter("p", title);
            ObjectQuery<Books> queryBook = db.Books.Where(
                "it.Title = @p", param);

            if (queryBook.Exists())
            {
                existingBook = db.Books.Where(
                    "it.Title = @p", param).First();
                newBooksInfo.Books = existingBook;
            }
            else
            {
                Books newBook = new Books();
                newBook.BookId = isbnNumber;
                newBook.Title = title;
                newBooksInfo.Books = newBook;
                db.AddToBooks(newBook);
            }

            Authors existingAuthor = null;
            ObjectParameter aParam = new ObjectParameter(
                "p", authorLastName);
            ObjectParameter aParam2 = new ObjectParameter(
                "q", authorFirstName);
            ObjectParameter[] pars =
                new ObjectParameter[] { aParam, aParam2 };
            ObjectQuery<Authors> queryAuthor = db.Authors.Where(
                "it.LastName = @p AND it.FirstName = @q", pars);

            if (queryAuthor.Exists())
            {
                existingAuthor = db.Authors.Where(
                    "it.LastName = @p AND it.FirstName = @q",
                    pars).First();
                newBooksInfo.Authors = existingAuthor;
            }
            else
            {
                Authors newAuthor = new Authors();
                newAuthor.AuthorId = Guid.NewGuid();
                newAuthor.LastName = authorLastName;
                newAuthor.FirstName = authorFirstName;
                newBooksInfo.Authors = newAuthor;
                db.AddToAuthors(newAuthor);
            }

            db.AddToBooksInfo(newBooksInfo);
            db.SaveChanges();

        }
    }

L'ultimo metodo di questo esempio restituisce entità BooksInfo che contengono il titolo del libro, il numero di ID del libro, il cognome dell'autore e informazioni sull'URL.

    [WebMethod]
    public BooksInfo[] GetBooksInfo()
    {
        using (BooksAuthorsEntities db =
            new BooksAuthorsEntities(
                Application.Contents["ConnString"] as String))
        {
            List<BooksInfo> booksInfoList =
                new List<BooksInfo>(db.BooksInfo);

            return booksInfoList.ToArray();
        }
    }

Questo metodo è utilizzato per visualizzare i dati nelle applicazioni client illustrate in Applicazione client per il servizio Web (applicazione di esempio EDM).

Vedere anche

Concetti

Servizio Web Books Authors (applicazione di esempio EDM)
Schemi del servizio Web Books Authors (applicazione di esempio EDM)
Applicazione client per il servizio Web (applicazione di esempio EDM)

Altre risorse

Specifiche EDM
Specifica di schemi e mapping (Entity Framework)