2011-05-16 10 views
5

estoy usando el marco de la entidad de la manera descrita aquí: Entity framework uses a lot of memoryejemplo ObjectContext se ha dispuesto

me di cuenta que necesito utilizar el "uso" declaración con el fin de trabajar correcta. Cuando estoy haciendo:

   using (IUnitOfWork uow = UnitOfWork.Current) 
       { 
        CompanyRepository rep = new CompanyRepository(); 
        m_AllAccounts = rep.GetQuery(). 
         Select(x => new Account(x)).ToList(); ///HERE I GET THE EXCEPTION 
       } 

Para este ejemplo, yo conseguir:

The ObjectContext instance has been disposed and can no longer be used for operations that require a connection. 

¿Qué estoy haciendo mal?

Respuesta

2

Puedo estar equivocado, sin embargo, lo primero que me viene a la mente es que probablemente UnitOfWork.Current devuelve una unidad de trabajo ya dispuesta.

imaginar el siguiente código:

void MethodA() 
{ 
    using (IUnitOfWork uow = UnitOfWork.Current) 
    { 
     // do some query here 
    } 
} 

void MethodB() 
{ 
    using (IUnitOfWork uow = UnitOfWork.Current) 
    { 
     // do another query here 
    } 
} 

MethodA(); // works OK 
// now UnitOfWork.Current is disposed 
MethodB(); // raises exception 

La cuestión se reduce a lo que exactamente UnitOfWork.Current hace y lo que es se supone que debe hacer. ¿Debería crear un nuevo objeto cada vez que se accede? ¿Debe mantener una referencia a menos que esté dispuesto? Esto no es obvio y es posible que haya estado confundido por esto.

+0

Puede ver la fuente en el enlace de la pregunta. En la respuesta de Ladislav Mrnka descubrió la situación. ¿Puede leer el comentario que le escribí? Solicito ayuda. – Naor

+0

¿Por qué usas 'Hashtable's entonces? Debe decidir: o bien debe crear una nueva Unidad de trabajo (que es uno a uno con 'ObjectContext') cada vez que quiera consultar algo, o no debe' Dispose' después de cada uso. ¿Cuál funciona mejor para ti? –

+0

Si no desecho el UnitOfWork/the Context, tendrá muchos objetos y este efecto en el rendimiento. ¿Estoy en lo cierto? – Naor

1

Bueno, el error habla por sí mismo. Después de cualquiera de sus **using** (IUnitOfWork uow = UnitOfWork.Current), se elimina su contexto "global". Por lo tanto, cualquier intento de acceder dará como resultado un error.

+0

¿Pero por qué se desechó? No lo deseché antes del final del "uso". ¿Puede decirme en mi código cómo lo dispongo? – Naor

+0

"using" build es solo "sintaxis de azúcar" para try-catch-finally block, alli finalmente block contiene llamada a var.Dispose(); - ver: http://msdn.microsoft.com/en-us/library/yh598w02.aspx –

+1

Entiendo eso, pero al hacer esto: m_AllAccounts = rep.GetQuery(). Seleccione (x => nueva cuenta (x)).Listar(); Obtengo la excepción, antes de llegar a la sección final. Entonces, ¿cómo el contexto dispuesto antes? – Naor

1

Supongo que ObjectContext se eliminó antes de llegar a la declaración using. Su pregunta vinculada muestra que almacena contexto en HttpContext.Items o HashTable. Si envolvió todas las llamadas en UnitOfWork.Current por using, solo funcionará el primer bloque; todas las demás se eliminarán del contexto HttpContext o HashTable.

+0

Creo que tiene razón, porque solo funcionó la primera llamada y, después de eso, el contexto eliminado aún estaba en HashTable. Estaba pensando en configurar el contexto en null después de eliminarlo, por lo que UnitOfWork obtendrá un valor nulo de la tabla de control y creará uno nuevo, pero creo que esto es una solución y no una solución. ¿Dónde y cómo crees que debería eliminar el UnitOfWork actual de la tabla hash? – Naor

Cuestiones relacionadas