2008-10-24 12 views
11

Estoy tratando de encontrar la mejor estrategia sobre cómo organizar DataContexts. La base de datos típica con la que trabajamos tiene entre 50 y 100 tablas, generalmente en tercera forma normal y con muchas relaciones entre ellas. Creo que tenemos dos opciones:LINQ to SQL multiple DataContext-s

  1. Coloque todas las tablas en un único contexto. Esto asegurará que todo lo que hagamos se cometerá en el orden correcto en la base de datos. El problema es que el diseñador de LINQ será un desastre con más de 50 tablas y me preocupa que el rendimiento se vea afectado.
  2. Crea varios contextos de datos basados ​​en la agrupación lógica de tablas. El problema es que habrá lugares donde un lado de una relación estará en un contexto y el otro en otro. Tendremos que encargarnos manualmente de comprometer ambos contextos en el orden correcto.

¿Hay alguna práctica recomendada para manejar esto?

Más detalles:

quiero crear mis propias entidades y unidad de trabajo en la parte superior de LINQ a SQL. Las entidades se definirán en un archivo de modelo xml donde también se especificará la asignación a entidades LINQ. Una herramienta personalizada generará mis entidades (POCO) según el modelo. El código del cliente solo interactuará con mis entidades y mi unidad de trabajo; nunca directamente con las entidades DataContext o LINQ. Sin embargo, no quiero duplicar lo que proporciona LINQ to SQL de forma predeterminada, así que quiero usar el LINQ DataContext subyacente. Esto significa que no puedo tener dos pedidos en diferentes contextos de datos, porque no sería posible mapear mi Orden POCO con ambos.

Respuesta

0

Debe crear contextos que le permitan realizar unidades de trabajo. Esto puede implicar superposición de asignaciones de tablas.

Contexto1: El cliente tiene muchas facturas

Contexto2: El cliente tiene muchas Órdenes

Context3: Factura tiene muchas Órdenes

+0

Pensé en esto, pero una orden desde Context2 no se puede usar en Context3 ... terminará con dos entidades de orden diferentes – Albert

+0

Si el trabajo está separado en unidades, nunca tratarías de usar un objeto de context2 en context3. –

+0

De hecho, quiero implementar POCO y Unidad de trabajo en la parte superior de las entidades LINQ para que el código del cliente funcione con un UnitOfWork que tendrá solo un tipo de órdenes. En su solución propuesta, no sabría qué contexto utilizar para los pedidos – Albert

2

asignaciones de LINQ a SQL son conjuntos de datos con tipo como, en el que cuando se utiliza uno, estás lidiando con una sesión que contiene datos. Puede tener las mismas tablas en varios DataContexts diferentes. Son solo clases, después de todo; no significan nada hasta que comienzas a interactuar con la base de datos, llenándolas con datos existentes o usándolos para crear nuevos datos.

Así que quizás tenga mesas de Cliente, Dirección, Teléfono, etc. con las que trate cuando envíe un nuevo catálogo. Luego tiene tablas de Factura, Artículo de línea, Producto, etc. que usa cuando crea un pedido. Pero en este último conjunto, es posible que desee tener Cliente también. Esta bien. Solo debes tener cuidado de tener una sesión activa a la vez para que no uses datos inconsistentes. No debería tener problemas al superponer entidades en sus diversos DataContexts, siempre que no los esté utilizando de manera superpuesta.

En cuanto al desorden, puede poner su DataContext en un espacio de nombre específico, y también puede poner sus diversas entidades en un espacio de nombre específico (aunque solo un espacio de nombres por conjunto de entidades en un DataContext). Puedes hacer esto en la ventana de Propiedades. Esto te permitirá mantener el Intellisense menos desordenado.

0

Utilizo un datacontext por base de datos.

Las tablas promedio pueden ser de hasta 100, sin embargo, por experiencia no tengo ningún problema de rendimiento.

El contexto de datos está en un proyecto separado, que se compila. El DLL resultante referencia de la BLL

4

Esta es una pregunta común que ha sido analizado a fondo aquí: http://craftycode.wordpress.com/2010/07/19/linq-to-sql-single-data-context-or-multiple/

En esencia, se debe crear como máximo un contexto de datos por grupo fuertemente conectada de mesas, o un contexto de datos por base de datos.

+0

la terminología aquí, ¿significa esto que solo tiene un DataContext db = new DataContext(), que ocurre dentro de un método que bloquea un objeto (o hace algo para asegurarse de que solo uno persista al mismo tiempo)? – paIncrease