【发布时间】:2010-11-02 20:18:24
【问题描述】:
我正在为我的实体框架 4 个实体使用以下 Structuremap 引导代码:
x.For<XEntities>().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest)).Use(() => new XEntities());
但是当我执行两个几乎同时的请求时,我得到了以下异常:
EntityException:The underlying provider failed on Open.
{"The connection was not closed. The connection's current state is connecting."}
我正在使用 ASP.NET MVC 2,在我的 Application_Start() 中有以下内容 EndRequest += new EventHandler(MvcApplication_EndRequest);
void MvcApplication_EndRequest(object sender, EventArgs e)
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
我能做些什么来解决这个问题?
[编辑] 这发生在一个有几个图像的页面上。图像来自数据库,由控制器操作提供服务,控制器从数据库中读取图像,并将其作为文件结果发送到浏览器。我认为 asp.net 正在破坏我的 objectcontext,并在图像请求进入时关闭我的数据库连接,并引发异常。
我现在需要的是一种正确的方式来管理对象上下文的生命周期。
【问题讨论】:
-
您绝对不想在 EndRequest 事件中调用 ObjectFactory 上的任何内容。 ObjectFactory 是静态的,这意味着它是用于所有请求的同一个对象。您可能正在处理中途的请求时调用 ReleaseAndDispose。
-
什么是 XEntities?那是管理您的数据库连接的对象吗?
-
您可能不需要 InstanceScope.PerRequest 生命周期,因为这是默认的(其中 request = 对容器的调用)。我假设您的意思是“在整个 HTTP 请求中给我相同的对象”。如果是这种情况,请查看 HTTP 范围的生命周期,如下 RPM1984 建议的那样。
-
XEntities 是我的 EF ObjectContext。
-
当我使用 x.For
().HybridHttpOrThreadLocalScoped().Use(new XEntities());我收到一个异常:底层提供程序在打开时失败,出现 InnerException:{“无效操作。连接已关闭。”}
标签: asp.net-mvc-2 entity-framework-4 structuremap