En cuanto a mis registros de errores ELMAH, estoy viendo unos InvalidOperationException
s de Entity Framework que tienen que ver con:¿Cómo puedo evitar que EF "El contexto no se pueda utilizar mientras se está creando el modelo" de errores?
The context cannot be used while the model is being created.
Esto es con la última biblioteca de EF CodeFirst de Nuget. La única información que he podido encontrar en la red es que está siendo causada por tener contextos de datos como singletons, que ciertamente no es mi caso. En mi instalador Windsor, mi unidad EF de la estructura de trabajo está siendo registrado:
container.Register(Component.For<IUnitOfWork>()
.ImplementedBy<EFUnitOfWork>()
.LifeStyle
.PerWebRequest);
soy capaz de recrear el error pulsando F5 en VS para comenzar a sesiones de depuración, y mientras IIS está girando carga hasta una segunda página web a la sesión de depuración.
Sospecho que es porque el usuario está tratando de acceder al sistema mientras que Asp.net se ha descargado debido a la falta de actividad, lo cual tiene sentido ya que mi producto se encuentra actualmente en una prueba beta muy pequeña. Sin embargo, dado que la gente real está usando el sitio web con datos en vivo, necesito que ocurran los menos errores posibles.
¿Alguien tiene alguna idea de cómo evitar que esto ocurra?
Editar: He actualizado mi controlador de Windsor para contener ahora el siguiente código:
container.Register(Component.For<IUnitOfWork>().ImplementedBy<EFUnitOfWork>().LifeStyle.PerWebRequest);
using (var context = new MyJobLeadsDbContext())
{
context.Set<UnitTestEntity>().Any();
}
Sin embargo, cuando intento realizar una solicitud Web segunda mientras IIS está cargando la aplicación, el error anterior se sigue produciendo
Edición 2: Conforme a lo solicitado, aquí está la pila
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
at System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)
at MyApp.DomainModel.Queries.Users.UserByEmailQuery.Execute() in C:\Users\KallDrexx\Documents\Projects\MyApp\MyApp.DomainModel\Queries\Users\UserByEmailQuery.cs:line 44
at MyApp.Infrastructure.MyAppMembershipProvider.GetUser(String email, Boolean userIsOnline) in C:\Users\KallDrexx\Documents\Projects\MyApp\MyApp\Infrastructure\MyAppMembershipProvider.cs:line 102
at System.Web.Security.Membership.GetUser(String username, Boolean userIsOnline)
at System.Web.Security.Membership.GetUser()
at MyApp.MyAppBaseController.Initialize(RequestContext requestContext) in C:\Users\KallDrexx\Documents\Projects\MyApp\MyApp\MyAppBaseController.cs:line 23
at System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
at System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext)
at System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
at System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
at System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f)
at System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action)
at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Esto es interesante. ¿Puede encontrar más detalles sobre el problema? Una vez que se crea el modelo, se debe bloquear el procesamiento de subprocesos para que el contexto no se use. –
No sé cómo encontrar más detalles sobre esto. Después de que el hilo de depuración de Visual Studio termine de cargarse, ya no veo este error. Solo parece ocurrir en la primera carga de la página web si ocurren dos llamadas simultáneas al mismo tiempo. – KallDrexx
¿Dos llamadas simultáneas? ¿Puedes validar que tienes una instancia nueva del contexto para cada solicitud? –