【问题标题】:Getting System.ObjectDisposedException when redirecting pages重定向页面时获取 System.ObjectDisposedException
【发布时间】:2018-09-06 16:37:26
【问题描述】:

更新:问题在于 OnGet 方法是异步的。感谢大家的帮助和意见!

在我的第一页(主页)中,我得到了一个用户列表:

主页模型:

public async void OnGetAsync()
    {
            var everything = await _context.Users.ToListAsync();
            GetUsers = everything;
    }

然后我在页面上创建一个用户列表和一个链接,该链接重定向到具有另一个用户投注列表的页面:

主页:

<ul class="list-group">
@foreach (var user in Model.GetUsers)
{
<li class="list-group-item">
    //Irrelevant stuff
    <a asp-page="./UserBets" asp-route-id="@user.Id">View Bets</a>
</li>
}
</ul>

重定向到 UserBets,这里是 UserBetsModel:

public async void OnGetAsync(string Id)
    {
        if (Id != null)
        {   //Debugging             
            Message += Id;
            using (var db = _context)
            {
                var everything = await _db.Bet.Where(a => a.UserId == Id).Select(s => s.MatchId).SingleAsync();
                GetBets = everything;
            }
        }            
    }

当它到达那里时,我收到一条消息:

System.ObjectDisposedException: '无法访问已处置的对象。此错误的一个常见原因是释放从依赖注入中解析的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果您在上下文上调用 Dispose() 或将上下文包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。 对象名称:'AsyncDisposer'。'

我试过不使用范围,在两个页面模型上都有它。 问题是我并不真正理解这里的问题,所以如果我没有给你足够的上下文或代码但问你是否需要更多,我很抱歉。

我想要做的是打印出用户投注列表。 提前致谢!

【问题讨论】:

标签: c# asp.net-core entity-framework-core razor-pages


【解决方案1】:
using (var db = _context)
{
    var everything = await _context.Bet.Where(a => a.UserId == Id).Select(s => s.MatchId).SingleAsync();
    GetBets = everything;
}

您的using 将在GetBets = everything; 行之后立即处理_context。问题是 _context 不属于您的方法,因此使用 _context 的任何其他代码都会发现它已被处理。我想您在其他地方也有类似的代码正在处理它,这可能就是这里出现问题的原因。

在不再使用共享对象之前不要释放它们(通常在包含类被销毁时 - 您应该在父类上添加自己的 IDisposable 实现)。

【讨论】:

  • 我在另一个页面中有一个 using 块。但是该页面与这两者没有任何关系,尽管它使用相同的上下文。即使两个页面(主页和 UserBets)不与另一个页面“对话”,这是否也会产生干扰?
  • _context 是通过依赖注入注入的单例吗?
  • 几乎可以肯定,_context 不“属于”你。 Dispose 不是你的工作,所以不要把它放在 using 语句中。
  • Startup 我把它添加到ConfigureServices : services.AddDbContext&lt;ApplicationDbContext&gt;(options =&gt; options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
  • @aneko5 - 也请注意我在您的 Q 中的评论。看起来您使用的不是async,因此可能在您的某些代码仍在运行时进行真正的清理/处置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2012-03-31
相关资源
最近更新 更多