DbContext已被处置(ASP.NET MVC)

尤金·苏霍姆林

我有GeneralRepository

这是代码

public class GeneralRepository
{



    public IEnumerable<Site> GetSites()
    {
        using (TraxgoDB ctx = new TraxgoDB())
        {
            return ctx.Sites;
        }
    }

    public Customer GetCustomer(int customerID, bool main = false)
    {
        using (TraxgoDB ctx = new TraxgoDB())
        {
            var customer = ctx.Customers.First(c => c.ID == customerID);
            if (main) customer = (customer as SubUser)?.MainUser ?? customer;

            return customer;
        }
    }
    public Dictionary<int,int> GetCustomerIDDictionary()
    {
        using (TraxgoDB ctx = new TraxgoDB())
        {
            return ctx.Customers.ToDictionary(
                c => c.ID,
                c => (c as SubUser) != null ? (int) (c as SubUser).MainUserID : c.ID
            );
        }
    }


}

在Global.asax中,我有使用回购和回购方法的代码

 private ConcurrentDictionary<string, SiteViewModel> InitializeSites()
    {
        var repository = new GeneralRepository();
        var siteDictionary = repository.GetSites().ToDictionary(
            s => s.HostName.ToLower(),
            s => SiteViewModel.CreateCustomTrackerwebSite(s.HostName, s)
        );

        return new ConcurrentDictionary<string, SiteViewModel>(siteDictionary);
    }

运行网站时出现此错误

由于已处置DbContext,因此无法完成该操作。

在这一行 var siteDictionary = repository.GetSites().ToDictionary

我该如何解决这个错误?

奥斯曼·伊古拉森

方法GeneralRepository.GetSites()返回一个IQueryable,而IQueryable不返回任何结果,它仅定义查询表达式,在执行该查询之前(例如,调用linq方法),不会返回任何结果。

而且您可以在方法GetSites()中看到dbContext在返回IQueryable Object之后才被处置(这只是一个查询定义)

public IEnumerable<Site> GetSites()
{
    using (TraxgoDB ctx = new TraxgoDB())
    {
        return ctx.Sites;
    }
}

因此,要解决您的问题,只需更改您的方法,如下所示:

public IEnumerable<Site> GetSites()
{
    using (TraxgoDB ctx = new TraxgoDB())
    {
        return ctx.Sites.ToList();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章