asp.net linq-to-sql datacontext

asp.net - Usar una variable estática de DataContext



linq-to-sql (2)

Solía ​​tener un DataContext por solicitud, pero depende de los escenarios que enfrenta. Creo que el punto con L2S fue usarlo con el patrón de unidad de trabajo, donde tienes un contexto por unidad de trabajo bien. Pero no funciona bien en aplicaciones más grandes, ya que es bastante difícil volver a conectar las entidades a un nuevo contexto más adelante.

Rick Strahl tiene una muy buena introducción al tema aquí:

http://www.west-wind.com/weblog/posts/246222.aspx

Una cosa con la que puedo decir que he tenido problemas en el pasado es tener un contexto para leer y escribir escenarios. El seguimiento de cambios realizado en el contexto de datos es bastante sobrecarga cuando solo está leyendo, que es lo que la mayoría de los webapps tiende a hacer la mayor parte del tiempo. Puedes hacer que el contexto de datos sea solo de lectura y acelerará un poco las cosas, pero necesitarás otro contexto para escribir.

Recientemente heredé una aplicación ASP.Net utilizando Linq2SQL. Actualmente, tiene sus objetos DataContext declarados como estáticos en cada página, y los creo la primera vez que encuentro que son nulos (singleton, más o menos).

Necesito comentarios si esto es bueno o malo. En situaciones en las que solo necesito leer desde el DB y en situaciones en las que también debo escribir.

¿Qué tal tener solo una instancia de DataContext para toda la aplicación?


Un DataContext por aplicación tendría un mal rendimiento, me temo. El DataContext no es seguro para subprocesos, para los principiantes, por lo que incluso usar uno como miembro estático de una página es una mala idea. Como mencionó Asgerhallas, es ideal usar el contexto para una unidad de trabajo, generalmente una única solicitud. Cualquier otra cosa y comenzará a encontrar todos sus datos en la memoria y no verá actualizaciones sin una actualización explícita. Aquí hay un par de publicaciones que hablan sobre esos dos temas: Mapas de identidad y Unidades de trabajo