2009-06-30 15 views
35

Al inicializar un contexto de marco de entidad.¿La mejor manera de inicializar un contexto de marco de entidad?

Uno es para inicializar a nivel de clase, tal como

public class EntityContactManagerRepository 
    : ContactManager.Models.IContactManagerRepository 
{ 
    private ContactManagerDBEntities _entities = new ContactManagerDBEntities(); 

    // Contact methods 
    public Contact GetContact(int id) 
    { 
     return (from c in _entities.ContactSet.Include("Group") 
       where c.Id == id 
       select c).FirstOrDefault(); 
    } 
} 

La otra forma es inicializar en el nivel de método.

public class EntityContactManagerRepository 
    : ContactManager.Models.IContactManagerRepository 
{  
    // Contact methods 
    public Contact GetContact(int id) 
    { 
     using (var entities = new ContactManagerDBEntities()) 
      return (from c in entities.ContactSet.Include("Group") 
       where c.Id == id 
       select c).FirstOrDefault(); 
    } 
} 

Desde el fondo Ado.Net, prefiero el posterior initialize-en el método, pero el primero es el ejemplo desarrollado por Stephen Walthe. O otra pregunta, ¿importa?

+0

El enlace está muerto ... – Jude

Respuesta

29

Importa, porque el contexto controla la vida útil de los datos de seguimiento de cambios y también las instancias de objetos que puede vincular cuando edita los objetos, ya que los objetos en dos contextos diferentes no pueden tener una relación entre sí. Me parece que los ejemplos que compartes provienen de una aplicación ASP.NET MVC. En este caso, generalmente utilizo un contexto de entidad por solicitud, ya que las solicitudes son efímeras y, como es común, al actualizar un objeto en una solicitud, tener que buscar otros objetos y crear relaciones entre ellos.

Por otro lado, no desea mantener un contexto de entidad durante mucho tiempo, ya que masticará la memoria a medida que rastrea los cambios en más y más objetos.

Esto puede parecer un argumento para la opción "un contexto por clase", pero realmente no lo es. Es más como un argumento para "un contexto por unidad de trabajo".

+1

Agradezca su respuesta. "Por lo general, uso un contexto de entidad por solicitud, ya que las solicitudes son de corta duración." Suena como que también lo prefiere en el nivel de método, ya que eso es vinculante para la solicitud. –

+1

No lo hago en el nivel de método porque el "método por solicitud" es una acción del controlador, y mis controladores no conocen los contextos de los objetos. Para mí, el contexto se instancia dentro del servicio que crea los repositorios/repositorios necesarios para el controlador. Pero tienes la idea general. –

+0

generalmente lo que hago es tener una clase de ayuda que devuelve una instancia del contexto, que se queda por la vida de la solicitud. Puede almacenar una referencia en el HttpContext actual (HttpContext.Current). –

7

En general, es el contexto por solicitud en ASP.NET y el contexto por ventana en WinForms/WPF.

Hay un artículo que explica bastante bien el razonamiento detrás del marco por solicitud de paradigma: Entity Framework Object Context Scope

+7

El enlace no funciona más. –

+0

sitio web tampoco. – Jude

2

Bueno, la "mejor" es siempre subjetiva. Sin embargo, agregar una clase UnitOfWorkScope al proyecto puede simplificar mucho las cosas, es decir, no tiene que pensar demasiado sobre la creación del contexto del objeto o la persistencia de la Unidad de trabajo en la base de datos.

Hay un gran artículo que explica How To Create a Unit of Work Scope.

Cuestiones relacionadas