Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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# 如何从ODataV4API操作返回IQueryable_C#_Entity Framework_Rest_Odata - Fatal编程技术网

C# 如何从ODataV4API操作返回IQueryable

C# 如何从ODataV4API操作返回IQueryable,c#,entity-framework,rest,odata,C#,Entity Framework,Rest,Odata,在本教程之后,我试图返回IQueryable,但出现错误,操作无法完成,因为DbContext已被释放 公共类产品控制器:ODataController { [启用查询] 公共IQueryable Get() { 返回GetRepository().GetQueryable(); } } GetRepository()是更大的通用DI和工作单元模式类的一部分,基本上 public Repository(DbContext context) { Context = context;

在本教程之后,我试图返回IQueryable,但出现错误,操作无法完成,因为DbContext已被释放

公共类产品控制器:ODataController
{
[启用查询]
公共IQueryable Get()
{
返回GetRepository().GetQueryable();
}
}
GetRepository()是更大的通用DI和工作单元模式类的一部分,基本上

public Repository(DbContext context)
{
    Context = context;
    DbSet = Context.Set<T>();
}

public virtual IQueryable<T> GetQueryable()
{
    IQueryable<T> query = DbSet;

    return query;
}
公共存储库(DbContext)
{
上下文=上下文;
DbSet=Context.Set();
}
公共虚拟IQueryable GetQueryable()
{
IQueryable query=DbSet;
返回查询;
}

如果仔细查看您提供的链接中给出的示例,您可以看到它们的上下文位于响应方法之外,并且在控制器上调用Dispose方法之前不会释放该上下文

    public class ProductsController : ODataController
        {
            ProductsContext db = new ProductsContext();

            [EnableQuery]
            public IQueryable<Product> Get()
            {
               return db.Products;
            }         

            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
        }
公共类产品控制器:ODataController
{
ProductsContext db=新产品上下文();
[启用查询]
公共IQueryable Get()
{
返回数据库产品;
}         
受保护的覆盖无效处置(布尔处置)
{
db.Dispose();
基地。处置(处置);
}
}

最有可能的情况是,在GetRepository()或GetQueryable()方法中处理创建的上下文。例如,通过使用
应用

如果仔细查看您提供的链接中给出的示例,您可以看到它们的上下文位于响应方法之外,并且在控制器上调用Dispose方法之前不会释放该上下文

    public class ProductsController : ODataController
        {
            ProductsContext db = new ProductsContext();

            [EnableQuery]
            public IQueryable<Product> Get()
            {
               return db.Products;
            }         

            protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }
        }
公共类产品控制器:ODataController
{
ProductsContext db=新产品上下文();
[启用查询]
公共IQueryable Get()
{
返回数据库产品;
}         
受保护的覆盖无效处置(布尔处置)
{
db.Dispose();
基地。处置(处置);
}
}

最有可能的情况是,在GetRepository()或GetQueryable()方法中处理创建的上下文。例如,当您从控制器返回IQueryable时,通过使用

应用
,您无法控制IQueryable何时运行。发生的情况是,在Web API管道开始运行IQueryable并返回结果之前,您的DbContext被释放

使用GetRepository所做的工作被称为服务定位器模式。然而,WebAPI有一种执行依赖项注入的机制,这将使您能够更确定地控制资源的生命周期

使用这种方法,您可以通过构造函数注入服务(GetRepository的返回类型),然后覆盖控制器上的Dispose,以便清理构造函数注入的服务。一旦控制器完成运行并从IQueryable返回结果,Web API将在控制器上调用Dispose,因此您的生存期问题将得到修复


NuGet上有许多常见IOC容器的包装器,允许它们自动与Web API一起工作。

当您从控制器返回IQueryable时,您无法控制IQueryable何时运行。发生的情况是,在Web API管道开始运行IQueryable并返回结果之前,您的DbContext被释放

使用GetRepository所做的工作被称为服务定位器模式。然而,WebAPI有一种执行依赖项注入的机制,这将使您能够更确定地控制资源的生命周期

使用这种方法,您可以通过构造函数注入服务(GetRepository的返回类型),然后覆盖控制器上的Dispose,以便清理构造函数注入的服务。一旦控制器完成运行并从IQueryable返回结果,Web API将在控制器上调用Dispose,因此您的生存期问题将得到修复


NuGet上有许多常见IOC容器的包装器,允许它们自动与Web API一起工作。

向我们展示
GetRepository
。为什么要投否决票?我怀疑代码是否给出了例外。“肯定还有更多!”帕特里克霍夫曼我在问为什么我会失望,可能是你的DI容器在处理它。显示相关配置。向我们显示
GetRepository
。为什么要投否决票?我怀疑代码是否给出了异常。“肯定还有更多!”帕特里克霍夫曼我在问为什么我会失望,可能是你的DI容器在处理它。显示相关配置。