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.
LINQ to SQL está diseñado especialmente para su uso en el nivel intermedio en una capa de acceso a datos (DAL) acoplada flexiblemente, como un servicio web. Si el nivel de presentación es una página web de ASP.NET, use el LinqDataSource control de servidor web para administrar la transferencia de datos entre la interfaz de usuario y LINQ to SQL en el nivel intermedio. Si el nivel de presentación no es una página de ASP.NET, tanto el nivel intermedio como el nivel de presentación deben realizar algún trabajo adicional para administrar la serialización y deserialización de los datos.
Configuración de LINQ to SQL en el nivel intermedio
En una aplicación de servicio web o de n niveles, el nivel intermedio contiene el contexto de datos y las clases de entidad. Puede crear estas clases manualmente o mediante SQLMetal.exe o el Diseñador relacional de objetos, tal como se describe en otra parte de la documentación. En tiempo de diseño, tiene la opción de hacer las clases de entidad serializables. Para obtener más información, vea How to: Make Entities Serializable. Otra opción es crear un conjunto independiente de clases que encapsulan los datos que se van a serializar y, a continuación, proyectarlos en esos tipos serializables al devolver datos en las consultas LINQ.
A continuación, defina la interfaz con los métodos a los que llamarán los clientes para recuperar, insertar y actualizar datos. Los métodos de interfaz encapsulan las consultas LINQ. Puede usar cualquier tipo de mecanismo de serialización para controlar las llamadas al método remoto y la serialización de datos. El único requisito es que si tiene relaciones cíclicas o bidireccionales en el modelo de objetos, como las relaciones entre Clientes y Pedidos en el modelo de objetos Northwind estándar, debe usar un serializador que lo admita. Windows Communication Foundation (WCF) DataContractSerializer admite relaciones bidireccionales, pero el XmlSerializer que se utiliza con servicios web que no utilizan WCF no lo hace. Si selecciona usar XmlSerializer, debe asegurarse de que el modelo de objetos no tenga relaciones cíclicas.
Para obtener más información sobre Windows Communication Foundation, vea Windows Communication Foundation Services y WCF Data Services en Visual Studio.
Implemente sus reglas de empresa u otra lógica específica del dominio utilizando las clases parciales y métodos de DataContext y las clases de entidad para conectar con eventos de tiempo de ejecución de LINQ to SQL. Para obtener más información, consulte Implementación de lógica de negocios de N niveles.
Definición de los tipos serializables
El nivel de cliente o presentación debe tener definiciones de tipo para las clases que recibirá del nivel intermedio. Esos tipos pueden ser clases de entidad propiamente dichas o clases especiales que envuelven sólo ciertos campos de las clases de entidad para la comunicación remota. En cualquier caso, LINQ to SQL no tiene en cuenta cómo el nivel de presentación adquiere esas definiciones de tipo. Por ejemplo, el nivel de presentación podría usar WCF para generar automáticamente los tipos, o podría tener una copia de un archivo DLL en el que se definen esos tipos o simplemente definir sus propias versiones de los tipos.
Recuperación e inserción de datos
El nivel intermedio define una interfaz que especifica cómo el nivel de presentación accede a los datos. Por ejemplo GetProductByID(int productID), o GetCustomers(). En el nivel intermedio, el cuerpo del método normalmente crea una nueva instancia de DataContext, ejecuta una consulta en una o varias de sus tablas. A continuación, el nivel intermedio devuelve el resultado como IEnumerable<T>, donde T es una clase de entidad u otro tipo que se usa para la serialización. El nivel de presentación nunca envía o recibe variables de consulta directamente hacia o desde el nivel intermedio. Los dos niveles intercambian valores, objetos y colecciones de datos concretos. Después de haber recibido una colección, el nivel de presentación puede usar LINQ to Objects para consultarla si es necesario.
Al insertar datos, el nivel de presentación puede construir un nuevo objeto y enviarlo al nivel intermedio, o bien puede hacer que el nivel intermedio construya el objeto en función de los valores que proporciona. En general, la recuperación e inserción de datos en aplicaciones de n niveles no difiere mucho del proceso en aplicaciones de 2 niveles. Para obtener más información, vea Consultar la base de datos y realizar y enviar cambios de datos.
Seguimiento de cambios para actualizaciones y eliminaciones
LINQ to SQL admite la simultaneidad optimista basada en marcas de tiempo, conocidas también como RowVersions, y en valores originales. Si las tablas de base de datos tienen marcas de tiempo, las actualizaciones y eliminaciones requieren poco trabajo adicional en el nivel intermedio o en el nivel de presentación. Sin embargo, si debe usar valores originales para las comprobaciones de simultaneidad optimista, la capa de presentación es responsable de rastrear dichos valores y reenviarlos cuando realiza actualizaciones. Esto se debe a que no se realiza un seguimiento de los cambios realizados en las entidades del nivel de presentación en el nivel intermedio. De hecho, la recuperación original de una entidad y la posible actualización realizada en ella suelen realizarse mediante dos instancias completamente independientes de DataContext.
Cuanto mayor sea el número de cambios que realiza el nivel de presentación, más complejo será realizar un seguimiento de esos cambios y empaquetarlos de nuevo al nivel intermedio. La implementación de un mecanismo para comunicar los cambios está completamente en función de la aplicación. El único requisito es que LINQ to SQL debe tener los valores originales necesarios para las comprobaciones de simultaneidad optimistas.
Para obtener más información, vea Operaciones de recuperación de datos y CUD en aplicaciones de N niveles (LINQ to SQL).