Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El ejemplo de servicio web de Books Authors discutido en este grupo de temas implementa una aplicación Entity Data Model (EDM) de los esquemas en el tema denominado Esquemas del servicio web de Books Authors (aplicación de ejemplo de EDM).
El espacio de nombres y clases que el servicio web de Books Authors utiliza está generado a partir de las entidades y asociaciones diseñadas en lenguaje de definición de esquemas conceptuales (CSDL). Los metadatos escritos en el lenguaje de definición de esquemas de almacenamiento (SSDL) describen las tablas de la base de datos que almacenan los datos para las clases. Los tipos en el esquema de diseños se asignan a los metadatos de almacenamiento en el lenguaje de especificación de asignaciones (MSL).
El modelo de objetos programables depende de la especificación de esquemas y asignaciones. El modelo de objetos está generado a partir del esquema conceptual; la DLL resultante requiere que los esquemas conceptuales y de almacenamiento, así como la especificación de asignación estén en el ámbito para que se pueda establecer una conexión de entidad.
El establecimiento de EntityConnection permite que las clases y el origen de datos estén disponibles para el código. Para obtener más información sobre cómo generar la biblioteca de clases, vea Implementar entidades (EDM).
Proyecto de servicio web
El servicio web que utiliza el modelo de objetos de Books Authors descrito en esta sección se implementa como un proyecto independiente. Cree un proyecto basado en la plantilla de servicio web ASP.NET. Agregue las referencias a las DLL System.Data.Entity y BooksAuthors creadas en el proyecto de objeto de modelo EDM. Al agregar las referencias, se crea una carpeta Bin que contiene las DLL.
Los esquemas deben estar en el ámbito del archivo ejecutable. Agregue los esquemas del proyecto de biblioteca de clases BooksAuthors a la carpeta App_Data en el proyecto de servicio web.
Web.config
Se necesita un archivo Web.config para buscar los esquemas, metadatos y el servidor de datos que los objetos EDM utilizan en el servicio web de BooksAuthors. El XML siguiente muestra el archivo Web.config para el servicio. La cadena de conexión identifica el servidor y la base de datos que la especificación de asignación utiliza para establecer una conexión entre las clases programables y la base de datos.
<?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>
Nota |
|---|
Esta cadena de conexión establece los conjuntos de resultados activos múltiples (MARS) en True según se requiere para invocar el método Load en las asociaciones cuando otro lector de datos ya está abierto en la misma conexión. |
Cuando el servicio se está ejecutando en un servidor web, debe buscar la ruta de acceso a los esquemas desde un directorio virtual. Una manera de realizarlo es utilizar el método Server.MapPath en el archivo global.asax. En el código siguiente, el método MapPath busca la ruta absoluta completa. La ruta de acceso que MapPath encuentra se sustituye en la cadena de conexión obtenida del archivo Web.config.
Los procedimientos se encuentran después del método Application_Start en el archivo global.asax que se muestra a continuación.
<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>
En las declaraciones Web Method , la cadena de conexión modificada se lee en la colección Application.Contents y se utiliza para crear instancias en el contexto del objeto del siguiente modo: BooksAuthorsEntities db = new BooksAuthorsEntities(Application.Contents["ConnString"] as String).
Código de la aplicación
El establecimiento de la conexión de entidad depende de la cadena de conexión en el archivo Web.config y del código en el constructor del servicio web. La cadena de conexión está almacenada en el archivo Web.Config, por consiguiente, la conexión se puede establecer en una línea de código: BooksAuthors db = new BooksAuthors(Application.Contents["ConnString"] as String)). Este servicio web inicializa la conexión de entidad de forma independiente en cada método que el servicio proporciona. SQL Server utiliza la agrupación de conexiones para que no se restrinja el rendimiento.
Los métodos de servicio web en esta aplicación se implementan como métodos públicos que inicializan y devuelven List<T>. Los protocolos de servicios web convierten las listas a texto y las devuelven como datos XML.
El primer método devuelve todas las entidades Books del sistema. Para recuperar los datos Books, se abre una conexión a los datos BooksAuthors en el servicio web. Un nuevo List<T> de tipo Books se inicializa y se utiliza para convertir la consulta Books<T> a una matriz que se puede devolver al llamador del método. A continuación, se cierra la conexión.
[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();
}
}
El método siguiente funciona la misma manera para devolver 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();
}
}
El método siguiente utiliza una consulta parametrizada en el título del libro para buscar todas las entidades BooksInfo en las que la propiedad BookTitle es igual al título proporcionado. Al utilizar estas entidades BooksInfo, se puede navegar por la asociación entre las entidades Authors y las entidades BooksInfo para tener acceso a todas las entidades Authors asociadas con el libro del título determinado.
Se devuelve una matriz de tipo Authors al llamador del método.
[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();
}
}
El método GetBooksFromAuthorLastName funciona como el método anterior para devolver una matriz de libros basándose en la consulta sobre el apellido de un autor.
[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();
}
}
Este servicio web también se puede utilizar para agregar entidades Books y el autor o autores del libro que se está agregando. Se puede utilizar la conexión de entidad para escribir los datos y leerlos. El método web siguiente crea entidades que representan un libro y su autor, agrega las entidades a ObjectContexty actualiza la base de datos. El método se puede utilizar cuantas veces como sea necesario para agregar más autores para el mismo título.
[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();
}
}
El último método de este ejemplo devuelve entidades BooksInfo que contienen el título del libro, el número del Id. de libro, el apellido del autor y la información del localizador.
[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();
}
}
Este método se utiliza para mostrar datos en las aplicaciones cliente que están en Aplicación cliente para servicio web (aplicación de ejemplo de EDM).
Vea también
Conceptos
Servicio web Books Authors (aplicación de ejemplo de EDM)
Esquemas del servicio web de Books Authors (aplicación de ejemplo de EDM)
Aplicación cliente para servicio web (aplicación de ejemplo de EDM)
Otros recursos
Especificaciones del EDM
Especificación de asignaciones y esquemas (Entity Framework)
Nota