2011-03-09 16 views
5

Así que en mi proyecto EF4 he abierto las clases parciales tanto del archivo DataContext en sí, como de un par de Table/Object generado por DataContext. Sin embargo, si abro una clase de "Productos" como parcial, no hay (por lo que puedo decir) un enlace directo desde la copia de seguridad del producto a la clase DataContext que lo engendró.¿Alguna desventaja al pasar alrededor de un objeto DataContext como un parámetro 'ref'?

public partial class Product 
{ 
    public DataContext GetContext() 
    { 
     return this.DataContext; 
     // FAILS!!! No connection from 'this' to DataContext 
     // makes sense because "Product" isn't REALLY derived from DataContext 
     //...but still, I want this to work! 
    } 
} 

Pero interior de la clase de producto parcial, de seguro que le gustaría ser capaz de consultar la base de datos directamente, y realmente me gustaría poder inicializar sólo una instancia de DataContext y utilizarlo para mi página aspx.cs consultas, así como las consultas ejecutadas desde las clases parciales que se llaman desde la página aspx.cs.

Así que mi solución hasta ahora es pasar en la instancia de DataContext como un parámetro 'ref' a los métodos de mi clase parcial que necesitan hurgar en la base de datos. Aquí está la clase parcial:

public partial class Complaint 
{ 
    public IEnumerable<Person> GetPByRole(InvestigationRole roleEnum, ref DataContext dbase) 
    { 
     var role = dbase.GetRole(roleEnum); 
     return this.PeopleOnInvestigations 
        .Where(x => x.InvestigationRoleID == 1) 
        .Select(x => x.Person); 
    } 
} 

Entonces, ¿hay un inconveniente a pasar alrededor de mi objeto DataContext como parámetro de referencia para los métodos de la clase parciales que necesitan acceso a la base de datos a través de esta conexión? Una de las ventajas es que una vez que se transfiere como una referencia, puedo "AddObject()" entidades nuevas desde dentro de estas clases parciales, y una vez que mi SaveChanges vuelve a llamar en mi página asp.cs se realiza, TODOS los cambios (desde el aspx y de los métodos de clase parciales) se ejecuta.

+0

¿DataContext es una estructura o clase? –

+1

'DataContext' es la clase LINQ to SQL. ¿Estás seguro de que estás utilizando Entity Framework? – Steven

+0

Yup EF4 en VS 2010. Por 'DataContext' me refiero a 'el gran objeto creado por EF desde mi modelo de datos', es decir, el archivo EDMX. – Graham

Respuesta

8

En primer lugar, pasar una variable ref se utiliza para poder cambiar la variable que contiene la referencia. Pero como no está cambiando la referencia DataContext dbase en su método GetPByRole, pasarlo como ref es inútil e incluso podría confundir a otros desarrolladores. Quizás malinterprete los tipos de valores y los tipos de referencia. Los tipos de referencia (como DataContext) se pasan siempre por referencia, pasándolos por las llamadas a método no harán nuevas copias del objeto en sí, simplemente copias de la referencia (que es un valor de 32 o 64 bits).

En segundo lugar, usted está mezclando responsabilidades aquí. Su clase Product es una entidad, pero parece que está implementando todo tipo de métodos de recuperación de datos en ella. Esto se convertirá en un gran desastre muy pronto. Dale a cada clase en tu sistema una sola responsabilidad. La responsabilidad de la clase Person es ser una persona.

En otras palabras, lo que está intentando hacer es mucho más adecuado para clases de repositorio (o incluso clases de servicio al respecto). Por ejemplo, cree un PersonRepository que contenga estos métodos. El PersonRepository podrá devolver nuevas instancias Person (de hecho, un repositorio debería ser solo la interfaz entre su fuente de datos y su aplicación, y normalmente no implementaría métodos de consulta relacionados con el negocio). De esta forma, mantendrá a sus entidades libres de conocer el contexto de los datos (que es una decisión de diseño muy deliberada del equipo de ADO.NET mientras desarrolla el Entity Framework).

+0

Todos sus puntos suenan válidos. Dentro de una clase de "PersonRepository", ¿estaría inicializando una nueva instancia de DataContext para hacer mis retrevales y luego deshacerme de ella? Estaba preocupado por crear y deshacerme de demasiados objetos de contexto de datos para una solicitud de una sola página, y por eso quería pasarlo, pero ¿es esta preocupación válida? – Graham

+2

No me preocuparía crear demasiados 'DataContext's, qué rendimiento se refiere. Esto nunca fue un problema para mí. Especialmente cuando se trata de operaciones de lectura.Sin embargo, debido a la atomización, es posible que desee considerar tener menos instancias 'DataContext' por solicitud. Lo que normalmente hago es envolver mis repositorios en una unidad de trabajo y dejar que esa unidad de trabajo controle el 'DataContext'. Separar operaciones de consulta de transacciones comerciales (operaciones CUD). Las clases de consulta definen métodos como 'GetPByRole' y usan la unidad de trabajo y los repositorios debajo: es decir, http://bit.ly/gAoDnO – Steven

Cuestiones relacionadas