Usar el modelo de objetos de AdventureWorks (EDM)

El código que usa la aplicación cliente AdventureWorks mostrado en el ejemplo siguiente demuestra varias características de Entity Data Model (EDM). Los esquemas descritos en los temas del modelo de AdventureWorks anteriores son la base para las entidades y las asociaciones que usa el código de esta sección.

Los tipos diseñados en esquemas y asignados al almacenamiento se generan como un modelo de objetos programable. Los datos de este modelo se pueden programar con la sintaxis de Common Language Runtime (CLR) sin consultas SQL incrustadas como cadenas en el código.

Configuración de la aplicación

El uso del modelo de objetos requiere una conexión con la base de datos donde se almacenan los datos de la aplicación. También se necesita una conexión de entidad a los objetos de tiempo de ejecución que proporciona la DLL generada a partir de los esquemas.

El archivo exe.config contiene una cadena de conexión que se utiliza para conectarse a una base de datos de SQL Server y establecer una conexión de entidad. Con una conexión de entidad, se puede obtener acceso a las entidades y asociaciones del modelo de objetos desde el código.

El programador debe agregar el texto de la cadena de conexión al archivo exe.config.

La asignación providerName="System.Data.EntityClient" especifica una conexión de entidad que utiliza los esquemas y asignaciones definidos en los esquemas que se muestran en los demás temas de esta sección.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="AdventureworksContext" connectionString='Metadata=.;
            Provider=System.Data.SqlClient;
            Provider Connection String="server=.\sqlExpress;
            database=Adventureworks;
            Integrated Security=true;Connection Timeout=5;
            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.

Usar las entidades y asociaciones de AdventureWorks

El código siguiente muestra las consultas basadas en las entidades y las asociaciones definidas en los esquemas en otros temas de esta sección de AdventureWorks.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdventureWorks;
using System.Data.Objects;
using System.Data.EntityClient;
using System.Data.Metadata.Edm;
using System.Collections.ObjectModel;


namespace AdventureworksClient
{
    class Program
    {
        static void Main(string[] args)
        {
            using (AdventureWorksContext objCtx = new AdventureWorksContext())
            {
                // find first 50 employees and display data.
                foreach (Employee employee in
                    objCtx.Employee.Where("it.EmployeeID < 50"))
                {
                    Console.WriteLine("EmployeeID: {0}",
                                              employee.EmployeeID);

                    // Find employee job candidate and print resume.
                    employee.JobCandidate.Load();
                    foreach (JobCandidate jc in employee.JobCandidate)
                        Console.WriteLine("\tJobCandidate: {0} \n\t{1}",
                            jc.JobCandidateID, jc.Resume);


                    // Find manager of employee and display.
                    if (null != employee.Employee2)
                    {
                        employee.Employee2.Employee2Reference.Load();
                        Console.WriteLine("Employee: {0} Manager: {1}",
                             employee.EmployeeID.ToString(),
                             employee.Employee2.EmployeeID.ToString());
                    }

                }

                // Employees IDs 1 - 290. 
                // Find first 50 with contact information.
                foreach (Contact contact in
                     objCtx.Contact.Where("it.ContactID < 50"))
                {
                    Console.WriteLine("Contact: {0} {1} {2}",
                        contact.ContactID, contact.FirstName,
                        contact.LastName);

                    foreach (EmployeeAddress emplAddress in
                                          objCtx.EmployeeAddress)
                    {
                        if (emplAddress.EmployeeID.Equals(contact.ContactID))
                        {
                            ObjectParameter param = new
                            ObjectParameter("p",
                                emplAddress.AddressID);
                            Address address =
                                objCtx.Address.Where(
                               "it.AddressID = @p",
                                param).First();

                            Console.WriteLine(
                              "\tEmployee address: {0}\n\t{1}\n\t{2}",
                              address.AddressLine1,
                              address.City, address.PostalCode);
                        }
                    }
                }

                // Find and display vendors.
                foreach (Vendor vendor in objCtx.Vendor)
                    Console.WriteLine("Vendor: {0}", vendor.Name);

                // Find and display store information.
                foreach (Store store in objCtx.Store)
                    Console.WriteLine("Store: {0}", store.Name);


                // Find and display product information.
                foreach (Product product in objCtx.Product)
                {
                    Console.WriteLine("Product Name: {0}", product.Name);
                    product.ProductModelReference.Load();
                    if (null != product.ProductModel)
                    {
                        Console.WriteLine("Model: {0}",
                            product.ProductModel.ProductModelID.ToString());
                    }
                }
            }

            try
            {
                // Establish a connection to the underlying data provider by 
                // using the connection string specified in the config file.
                using (EntityConnection connection =
                    new EntityConnection("Name=AdventureWorksContext"))
                {
                    // Open the connection.
                    connection.Open();

                    // Access the metadata workspace.
                    MetadataWorkspace workspace =
                       connection.GetMetadataWorkspace();

                    // To run DisplayProperties(workspace, DataSpace.CSpace);
                    // to display the extended properties in the conceptual model.
                    // see Extended Property (CSDL) (link under See Also).
                }
            }
            catch (System.Data.MetadataException exceptionMetadata)
            {
                Console.WriteLine("MetadataException: {0}",
                                exceptionMetadata.Message);
            }
            catch (System.Data.MappingException exceptionMapping)
            {
                Console.WriteLine("MappingException: {0}",
                                 exceptionMapping.Message);
            }

        }

        
    }
}

Vea también

Conceptos

Propiedad extendida (CSDL)

Otros recursos

Especificaciones del EDM
Especificación de asignaciones y esquemas (Entity Framework)
Aplicaciones de ejemplo (Entity Framework)