尝试将DbContext注入到Azure函数中时收到以下错误:
Microsoft.EntityFrameworkCore: Cannot access a disposed object.
这是当前功能
private readonly FundCentreContext _fundCentreContext;
public GetDailyPrices(FundCentreContext fundCentreContext)
{
_fundCentreContext = fundCentreContext;
}
[Produces("application/json")]
[FunctionName(nameof(GetDailyPrices))]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "api/dailyprices")] HttpRequest req,
ILogger log)
{
//Parameters
var parameters = req.GetQueryParameterDictionary();
var page = int.Parse(parameters.GetValueOrDefault("page", "0"));
var limit = int.Parse(parameters.GetValueOrDefault("limit", "10"));
var offset = int.Parse(parameters.GetValueOrDefault("offset", "0"));
var sort = parameters.GetValueOrDefault("sort", "asc");
var fundService = new FundService(_fundCentreContext);
var fundDailyPrices = fundService.GetAllDailyPricesByPage(page, limit, offset);
return fundDailyPrices != null
? (ActionResult)new OkObjectResult(fundDailyPrices)
: new BadRequestObjectResult("There was an error with your request");
}
使用该服务的启动程序还具有以下代码:
services
.AddDbContext<FundCentreContext>(options =>
options.UseSqlServer("*ommited*"));
我不知道为什么会发生此错误-通过return语句进行调试可以正常工作,并且可以在fundDailyPrices对象中看到数据,但是在return语句之后的某些操作意外终止了整个函数。
答案 0 :(得分:1)
很难用您提供的代码来判断,但是最可能的罪魁祸首是直到上下文超出范围时才实现实例集。同样,我们看不到所有代码,但是当您执行诸如直接返回IQueryable
之类的操作时,就会发生这种情况。任何类型的服务调用都应返回实例化列表(即在返回结果集之前调用ToList()
或ToListAsync()
)。如果您已启用该功能,则也可能是由于延迟加载引起的。如果是这样,您应该确保所有必要的关系都已准备就绪。
使用注入的上下文更新服务也很奇怪。您应该简单地注入服务,并且由于它对上下文具有构造函数依赖关系,因此它将自动注入其中。这样可以确保两个对象在相同或至少兼容的生存期内运行。
此外,请勿将IDisposable
与注入的依赖项一起使用。我们无法提供有关您的服务类的任何信息,但是如果它确实实现了IDisposable
,请删除它。