【问题标题】:How to return IQueryable from an oData V4 api action如何从 oData V4 api 操作返回 IQueryable
【发布时间】:2016-11-01 21:19:47
【问题描述】:

按照教程 here 我正在尝试返回 IQueryable 但我收到错误操作无法完成,因为 DbContext 已被释放

public class ProductsController : ODataController
{
    [EnableQuery]
    public IQueryable<Product> Get()
    {
        return GetRepository<Product>().GetQueryable();
    }
}

GetRepository() 是一个更大的通用 DI 和工作单元模式类的一部分,基本上

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

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

    return query;
}

【问题讨论】:

  • 告诉我们GetRepository
  • 为什么投反对票?
  • 我怀疑代码是否给出了异常。必须有更多。
  • @PatrickHofman 我在问我为什么被否决
  • 可能是您的 DI 容器正在处理它。显示相关配置。

标签: c# entity-framework rest odata


【解决方案1】:

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

您使用 GetRepository 执行的操作称为服务定位器模式。然而,Web API 有一种执行依赖注入的机制,它可以让您更确定地控制资源的生命周期。

https://www.asp.net/web-api/overview/advanced/dependency-injection

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

NuGet 上有许多常见 IOC 容器的包装器,以允许它们自动使用 Web API。

【讨论】:

    【解决方案2】:

    如果您仔细查看您提供的链接中给出的示例,您会发现它们具有响应方法之外的上下文,并且在控制器上调用 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);
                }
            }
    

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

    【讨论】:

    • спасибо парень, спас меня от суицида
    • 我在控制器方法中处理了一个 IoC 容器,在覆盖中处理容器解决了我的问题!
    猜你喜欢
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多