Instancia múltiple / única de Linq a SQL DataContext


Tengo un proyecto con varias clases diferentes que consultan y modifican datos en un conjunto común de tablas. He preparado una.archivo dbml que nos proporciona una clase DataContext. Mi pregunta es si una sola instancia del DataContext debe ser utilizada por todos los objetos, o si varias instancias son seguras de usar. También me pregunto sobre la seguridad del hilo en el caso de un solo DataContext, y si el acceso a sus métodos debe sincronizarse.

Author: spender, 2008-10-22

5 answers

Rick Strahl tiene un buen artículo sobre sus opciones: http://www.west-wind.com/weblog/posts/246222.aspx .

Vea también: LINQ to SQL - ¿ dónde vive su DataContext?.

Es posible que desee una estrategia ligeramente diferente para cada tipo de implementación: web, escritorio, servicio de Windows...

Resumido, sus opciones son:

  • DataContext global: peligroso en entornos multihilo (incluidas las aplicaciones web). Recuerde que los miembros de instancia son no se garantiza que sea seguro para el hilo (de la respuesta de Bradley Grainger anterior).
  • DataContext por hilo - complicado. Si su DataContext está rastreando los cambios, debe asegurarse de vaciarlos en el momento adecuado. Crear instancias, almacenar y recuperar el DataContext es un problema.
  • DataContext por acción atómica: pierde la capacidad de realizar un seguimiento de los cambios ya que un DataContext crea un objeto mientras otro lo actualiza o lo elimina. Adjuntar un objeto de datos a un nuevo DataContext puede no funcionar como usted espera.
  • DataContext per data object - parece poco elegante porque tiene que preocuparse por el DataContext en la instanciación(crear y adjuntar) y actualizar/eliminar (extraerlo del objeto de datos y usarlo).

Opté por un DataContext por objeto de datos. Puede que no sea la solución más elegante, pero funciona en todos los entornos de implementación.

 33
Author: Corbin March,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:24

Utilizo una nueva instancia de DataContext para cada transacción.

Reutilizar instancias antiguas puede ser problemático, e hinchará el contenido del DataContext, ya que cualquier elemento que se haya cargado en algún momento, tendrá que ser rastreado - su aplicación se volverá más y más lenta, hinchando la memoria.

Si necesita un elemento más largo que para una transacción, puede separarlo del DataContext clonando el elemento, y puede volver a conectarlo más tarde a un DataContext nuevo y fresco utilizando Conectar().
Incluso puedo clonar un elemento, enviarlo a través de la red con WCF, recuperarlo en alguna llamada posterior, adjuntarlo a un nuevo DataContext y guardar los cambios (por supuesto, necesito una columna de marca de tiempo para esto).

 9
Author: Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-23 11:16:40

La clase DataContext es lo suficientemente ligera como para que pueda instanciarla una y otra vez. Esto hace que las cosas sean más simples cuando se accede a objetos de entidad dentro de un solo método. Si necesita acceder a los mismos objetos LINQ de diferentes clases y métodos mientras los mantiene conectados al DataContext para fines de seguimiento, también está bien mantener una sola instancia.

 8
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-22 15:27:58

El problema con el uso de un único objeto data-context es que puede tener problemas si ha agregado algunos cambios a su cola, y desea hacer una reversión solo en algunos de esos cambios en cola.

Es por eso que uso un objeto data-context para cada una de mis clases my mi clase User tiene su propio data-context, mi clase Application tiene su propio, y así sucesivamente.

Este patrón elimina la mayoría de los problemas de hacer reversiones en mis proyectos.

 3
Author: cllpse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-22 15:19:56

Siempre he oído que debe usar una sola instancia del DataContext. Por lo general, creo una instancia singleton de mi DC en mi clase de lógica de negocio, y lo uso para todas mis consultas linq.

Estoy seguro de que algunos de los gurús de linq aquí podrían ser capaces de darle razones exactas de por qué solo debe tener en instancia de su clase de contexto de datos... No estoy muy seguro.

 -3
Author: Rafe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-22 15:09:06