Freigeben über


Books Authors-Webdienst – Implementierung (EDM-Beispielanwendung)

Bei dem in dieser Themengruppe erläuterten Beispiel des Books Authors-Webdiensts wird eine Entitätsdatenmodell (EDM)-Anwendung aus den Schemas im Thema Schemas für den Books Authors-Webdienst (EDM-Beispielanwendung) implementiert.

Der Namespace und die Klassen des Books Authors-Webdiensts werden aus den Entitäten und Zuordnungen erstellt, die in konzeptioneller Schemadefinitionssprache (Conceptual Schema Definition Language, CSDL) entworfen wurden. Datenbanktabellen zur Speicherung der Daten für die Klassen werden durch Metadaten beschrieben, die in der Datenspeicherschema-Definitionssprache (Store Schema Definition Language, SSDL) geschrieben sind. Die Typen im Entwurfsschema werden Speichermetadaten in der Mapping-Spezifikationssprache (Mapping Specification Language, MSL) zugeordnet.

Das programmierbare Objektmodell hängt sowohl von den Schemas als auch von der Mappingspezifikation ab. Das Objektmodell wird aus dem konzeptionellen Schema erstellt. Für die daraus resultierende DLL ist erforderlich, dass sich das konzeptionelle Schema und das Speicherschema sowie die Mappingspezifikation im Gültigkeitsbereich befinden, damit eine Entitätsverbindung hergestellt werden kann.

Durch das Herstellen der EntityConnection werden die Klassen und Datenquellen für den Code verfügbar. Weitere Informationen zum Erstellen der Klassenbibliothek finden Sie unter Implementieren von Entitäten (EDM).

Webdienstprojekt

Der Webdienst, der das in diesem Abschnitt erläuterte Books Authors-Objektmodell verwendet, wird als separates Projekt implementiert. Erstellen Sie ein Projekt, das auf der ASP.NET-Webdienstvorlage basiert. Fügen Sie Verweise auf die System.Data.Entity-DLL und die im EDM-Objektprojekt erstellte BooksAuthors-DLL hinzu. Beim Hinzufügen der Verweise wird ein Bin-Ordner erstellt, der die DLLs enthält.

Die Schemas müssen sich im Gültigkeitsbereich der ausführbaren Datei befinden. Fügen Sie die Schemas aus dem BooksAuthors-Klassenbibliotheksprojekt dem Ordner App_Data im Webdienstprojekt hinzu.

Web.config

Eine Web.config-Datei ist notwendig, um von den EDM-Objekten im BooksAuthors-Webdienst verwendete Schemas, Metadaten sowie den Datenserver zu lokalisieren. Im folgenden XML wird die Datei Web.config für den Dienst gezeigt. Die Verbindungszeichenfolge gibt den Server und die Datenbank an, die von der Mappingspezifikation verwendet werden, um eine Verbindung zwischen den programmierbaren Klassen und der Datenbank herzustellen.

<?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>
NoteHinweis

Diese Verbindungszeichenfolge legt "Multiple Active Result Sets" auf "True" fest. Dies ist erforderlich, um die Load-Methode für Zuordnungen aufzurufen, wenn für dieselbe Verbindung bereits ein anderer Datenleser geöffnet wurde.

Wenn der Dienst auf einem Webserver ausgeführt wird, muss der Pfad der Schemas von einem virtuellen Verzeichnis aus ermittelt werden. Dies wird z. B. durch die Verwendung der Server.MapPath-Methode in der Datei global.asax ermöglicht. Im folgenden Code ermittelt die MapPath-Methode den vollqualifizierten absoluten Pfad. Der von MapPath ermittelte Pfad wird in der aus der Datei Web.config abgerufenen Verbindungszeichenfolge ersetzt.

Die Vorgehensweisen werden nach der Application_Start-Methode in der Datei global.asax direkt im Anschluss veranschaulicht.

  <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>

In den Web Method -Deklarationen wird die geänderte Verbindungszeichenfolge aus der Application.Contents-Auflistung gelesen und wie folgt zum Instanziieren des Objektkontexts verwendet: BooksAuthorsEntities db = new BooksAuthorsEntities(Application.Contents["ConnString"] as String).

Anwendungscode

Zum Herstellen der Entitätsverbindung wird die Verbindungszeichenfolge in der Datei Web.config und Code im Webdienstkonstruktor benötigt. Die Verbindungszeichenfolge wird in der Datei Web.Config gespeichert. Daher kann die Verbindung in einer einzigen Codezeile hergestellt werden: BooksAuthors db = new BooksAuthors(Application.Contents["ConnString"] as String)). Bei diesem Webdienst wird die Entitätsverbindung in jeder vom Dienst bereitgestellten Methode separat initialisiert. SQL Server verwendet Verbindungspooling, sodass die Leistung dadurch nicht beeinträchtigt wird.

Die Webdienstmethoden in dieser Anwendung werden als öffentliche Methoden implementiert, die List<T> initialisieren und zurückgeben. Die Listen werden durch die Protokolle von Webdiensten in Text umgewandelt und als XML-Daten zurückgegeben.

Die erste Methode gibt alle Books-Entitäten im System zurück. Um die Books-Daten abzurufen, wird eine Verbindung zu den BooksAuthors-Daten für den Webdienst geöffnet. Eine neue List<T> des Typs Books wird initialisiert und verwendet, um die Books Query<T> in ein Array umzuwandeln, das an den Aufrufer der Methode zurückgegeben werden kann. Anschließend wird die Verbindung geschlossen.

    [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();
        }
    }

Die nächste Methode funktioniert auf dieselbe Weise, um Authors zurückzugeben.

    [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();
        }
    }

Die folgende Methode verwendet eine parametrisierte Abfrage nach dem Buchtitel, um alle BooksInfo-Entitäten zu finden, bei denen die BookTitle-Eigenschaft dem angegebenen Titel entspricht. Mithilfe dieser BooksInfo-Entitäten kann die Zuordnung zwischen Authors-Entitäten und den BooksInfo-Entitäten navigiert werden, um auf alle Authors-Entitäten zuzugreifen, die mit dem Buch des angegebenen Titels verknüpft sind.

Ein Array des Typs Authors wird an den Aufrufer der Methode zurückgegeben.

    [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();
        }
    }

Die GetBooksFromAuthorLastName-Methode funktioniert wie die vorherige Methode, um ein Array von Büchern anhand einer Abfrage nach dem Nachnamen eines Autors zurückzugeben.

    [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();
        }
    }

Dieser Webdienst kann auch zum Hinzufügen von Books-Entitäten sowie von Autoren des Buchs verwendet werden. Die Entitätsverbindung kann zum Schreiben und Lesen von Daten verwendet werden. Die folgende Webmethode erstellt Entitäten, die ein Buch und den zugehörigen Autor darstellen, fügt die Entitäten dem ObjectContext hinzu und aktualisiert die Datenbank. Die Methode kann beliebig oft verwendet werden, um mehrere Autoren für denselben Titel hinzuzufügen.

    [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();

        }
    }

Die letzte Methode in diesem Beispiel gibt BooksInfo-Entitäten zurück, die den Buchtitel, die ID-Nummer des Buchs, den Nachnamen des Autors sowie Lokatorinformationen enthalten.

    [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();
        }
    }

Diese Methode wird verwendet, um Daten in den Clientanwendungen anzuzeigen, die unter Clientanwendung für einen Webdienst (EDM-Beispielanwendung) dargestellt werden.

Siehe auch

Konzepte

Books Authors-Webdienst (EDM-Beispielanwendung)
Schemas für den Books Authors-Webdienst (EDM-Beispielanwendung)
Clientanwendung für einen Webdienst (EDM-Beispielanwendung)

Weitere Ressourcen

EDM-Spezifikationen
Schemas und Mappingspezifikation (Entity Framework)