Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OData控制器中的静态实体框架数据库上下文_C#_Entity Framework_Rest_Asp.net Web Api_Odata - Fatal编程技术网

C# 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

在ASP.NET Web API的OData教程中,他们总是将新的
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不是为每个请求创建的。在请求中出现错误后,我继续在以下请求中获取实体上下文处理异常。