2009-06-02 23 views
8

En una aplicación web que me he encontrado, he encontrado el siguiente código para hacer frente a la DataContext cuando se trata de LinqToSqlLinqToSql DataContext estática en una aplicación web

public partial class DbDataContext 
    { 
    public static DbDataContext DB 
    { 
     get 
     { 
     if (HttpContext.Current.Items["DB"] == null) 
      HttpContext.Current.Items["DB"] = new DbDataContext(); 
     return (DbDataContext)HttpContext.Current.Items["DB"]; 
     } 
    } 
    } 

Entonces referencia a ella más adelante haciendo esto:

DbDataContext.DB.Accounts.Single(a => a.accountId == accountId).guid = newGuid; 
DbDataContext.DB.SubmitChanges(); 

He estado investigando las mejores prácticas cuando se trata de LinqToSQL.

No estoy seguro del enfoque que ha tomado este cuando se trata de que DataContext no sea ThreadSafe y se mantenga una copia estática de ello.

¿Es este un buen enfoque para tomar en una aplicación web?

@ Longhorn213 - De acuerdo con lo que dices y cuanto más he leído en HttpContext por eso, creo que tienes razón. Pero en la aplicación que he heredado, esto es confuso porque al comienzo de cada método se está volviendo a consultar el db para obtener la información, luego se modifica esa instancia del contexto de datos y se envían los cambios en él.

A partir de esto, creo que debe desaconsejarse este método porque da la falsa impresión de que el contexto de datos es estático y persiste entre las solicitudes. Si un futuro desarrollador piensa que volver a consultar los datos al principio de un método porque cree que ya está allí, podría tener problemas y no entender por qué.

Supongo que mi pregunta es, ¿debería desaconsejarse este método en futuros desarrollos?

+0

Aquí hay una gran publicación con más detalles: http://blog.stevensanderson.com/2007/11/29/linq-to-sql-the-multi-tier-story/ –

+0

Acabamos de lanzar una variante de este concepto esta noche. –

Respuesta

6

Esto no es una copia estática. Tenga en cuenta que la propiedad lo recupera de Context.Items, que es por solicitud. Esta es una copia por solicitud del DataContext, al que se accede a través de una propiedad estática.

Por otro lado, esta propiedad está asumiendo solo un hilo por solicitud, lo que puede no ser cierto para siempre.

0

A DataContext es barato de hacer y no obtendrá mucho almacenando en caché de esta manera.

0

He hecho muchas aplicaciones web de Linq a Sql y no estoy seguro de si lo que tiene funcionaría.

Se supone que el contexto de datos realiza un seguimiento de los cambios que realiza en sus objetos y no lo hará en esta instancia.

Así que cuando vengas presionar enviar cambios, no sabrá que alguno de tus objetos se actualizó, por lo tanto no actualiza la base de datos.

Tienes que trabajar un poco más con el contexto de datos en un entorno desconectado, como una aplicación web. Es más difícil con una actualización, pero no tan malo. No almacenaría en caché y simplemente lo recrearé.

+2

¿Por qué no conocer los cambios realizados durante la solicitud? –

+0

Debido a que solo se puede acceder al contexto de datos a petición y se destruye después del ciclo posterior de la publicación. Vuelve al servidor y el contexto de datos no está allí para realizar un seguimiento de los cambios realizados en cualquiera de los objetos. –

+1

Dije, "durante la solicitud". –

0

También el contexto en sí no es transaccional, por lo que teóricamente es posible que ocurra una actualización en otra solicitud y su actualización podría fallar.

0

Prefiero crear una clase base de página (heredar de System.Web.UI.Page) y exponer una propiedad DataContext. Asegura que haya una instancia de solicitud DataContext por página.

Esto ha funcionado bien para mí, es un buen equilibrio en mi humilde opinión. Puedes simplemente llamar a DataContext.SubmitChanges() al final de la página y puede estar seguro de que todo está actualizado. También se asegura de que todos los cambios sean para un usuario a la vez.

Hacer esto a través de estática causará dolor - Me temo que DataContext perderá de vista los cambios ya que está tratando de rastrear cambios para muchos usuarios al mismo tiempo. No creo que haya sido diseñado para eso.

+1

El código que publicó no es un DataContext estático. Es por solicitud. Solo una solicitud única y, por lo tanto, solo un usuario único puede acceder a ella. –

+0

sí, de acuerdo. está "oculto" detrás de un método estático. –

Cuestiones relacionadas