C# OData控制器中的静态实体框架数据库上下文
在ASP.NET Web API的OData教程中,他们总是将新的C# OData控制器中的静态实体框架数据库上下文,c#,entity-framework,rest,asp.net-web-api,odata,C#,Entity Framework,Rest,Asp.net Web Api,Odata,在ASP.NET Web API的OData教程中,他们总是将新的DbContext设置为控制器的私有属性 public class LocationPropertiesController : ODataController { Entities ctx = new Entities(); [EnableQuery] public IQueryable<LocationProperties> Get() { return ctx.L
DbContext
设置为控制器的私有属性
public class LocationPropertiesController : ODataController
{
Entities ctx = new Entities();
[EnableQuery]
public IQueryable<LocationProperties> Get()
{
return ctx.LocationProperties;
}
protected override void Dispose(bool disposing)
{
ctx.Dispose();
base.Dispose(disposing);
}
}
公共类LocationPropertiesController:ODataController
{
实体ctx=新实体();
[启用查询]
公共IQueryable Get()
{
返回ctx.LocationProperties;
}
受保护的覆盖无效处置(布尔处置)
{
ctx.Dispose();
基地。处置(处置);
}
}
认为dispose方法可以完成这项工作
但现实情况是,上下文、连接或其他任何东西可能会失败,然后我会得到一个已处理的ctx,在下面的请求中我无法重用它,因为提供给我的控制器仍然是同一个实例
另一方面,如果IQueryable被返回,OData可以对活体执行过滤,如果我使用(ctx…)将该查询包装起来,那么我将成为数据库的厚客户端
那么,我们是在处理OData中的设计缺陷还是我在这里遗漏了什么?给我的控制器仍然是同一个实例,你确定吗?你说的没有多大意义。在你的代码中。。。上下文是根据LocationPropertiesController的实例创建的,当LocationPropertiesController被释放时,LocationPropertiesController本身将有一个实例(ctx ie上下文),作为该实例一部分的ctx也将有一个实例。始终为每个新传入的请求创建一个新的控制器实例。这是MVC、Web API以及在Web API控制器上构建(并扩展)的Odata控制器的基础。首先,了解Odata表达式树在数据库服务器上具体化之前与IQueryable合并。其次,您应该考虑使用IoC容器来处理您的上下文。查看这些链接:@Igor No不是为每个请求创建的。在请求出错后,我继续在以下请求上处理实体上下文异常。提供给我的控制器仍然是同一个实例。你确定吗?你的错误没有多大意义。在你的代码中。。。上下文是根据LocationPropertiesController的实例创建的,当LocationPropertiesController被释放时,LocationPropertiesController本身将有一个实例(ctx ie上下文),作为该实例一部分的ctx也将有一个实例。始终为每个新传入的请求创建一个新的控制器实例。这是MVC、Web API以及在Web API控制器上构建(并扩展)的Odata控制器的基础。首先,了解Odata表达式树在数据库服务器上具体化之前与IQueryable合并。其次,您应该考虑使用IoC容器来处理您的上下文。查看这些链接:@Igor No不是为每个请求创建的。在请求中出现错误后,我继续在以下请求中获取实体上下文处理异常。