C# 如何从ODataV4API操作返回IQueryable
在本教程之后,我试图返回IQueryable,但出现错误,操作无法完成,因为DbContext已被释放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;
公共类产品控制器: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容器在处理它。显示相关配置。