【问题标题】:structuremap entity framework 4 connectionstructuremap实体框架4连接
【发布时间】: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


【解决方案1】:

为什么要在 Application_Start() 中为 EndRequest 分配委托?

直接挂钩到事件中:

protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

另外,我以前从未使用过该语法,这就是我的做法:

For<XEntities>().HybridHttpOrThreadLocalScoped().Use<XEntities>()

另外,你在什么时候更新你的数据上下文?你能显示一些代码吗?

【讨论】:

  • 我试过你的方法 x.For().HybridHttpOrThreadLocalScoped().Use(new XEntities());这就是我创建数据上下文的方式。我现在直接在事件中钩住了endRequest,我得到以下异常: ObjectContext 实例已被释放,不能再用于需要连接的操作。
  • @jwdehaan - 你在哪里使用数据上下文?在您的控制器中?通过存储库?你能显示一些代码吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-20
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2011-04-08
相关资源
最近更新 更多