Asp.net mvc 4 强制执行singleordefault

Asp.net mvc 4 强制执行singleordefault,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,有人能告诉我为什么下面的代码在api控制器(MVC4)中不起作用吗?我得到一个错误,说“无法访问已处置的对象”。我发现在其他情况下,应该调用ToList(),以便强制执行查询。但是在我的例子中,我使用的是SingleOrDefault(),这不是立即在数据库上执行的吗 public HttpResponseMessage GetPurchaseOrder(int POId) { PurchaseOrder po; HttpResponseMessa

有人能告诉我为什么下面的代码在api控制器(MVC4)中不起作用吗?我得到一个错误,说“无法访问已处置的对象”。我发现在其他情况下,应该调用ToList(),以便强制执行查询。但是在我的例子中,我使用的是SingleOrDefault(),这不是立即在数据库上执行的吗

    public HttpResponseMessage GetPurchaseOrder(int POId)
    {
        PurchaseOrder po;
        HttpResponseMessage resp;

        using (PMDataDataContext database = new PMDataDataContext())
        {
            po = database.PurchaseOrders.SingleOrDefault(x => x.POId == POId);
            if (po == null)
            {
                var message = string.Format("id = {0} not found", POId);
                HttpError err = new HttpError(message);
                resp = Request.CreateResponse(HttpStatusCode.NotFound, err);                    
            }
            else
            {
                resp = Request.CreateResponse(HttpStatusCode.OK, po);
            }
        }
        return resp;
    }

请尝试这样做,以便在查询之后立即释放数据库的上下文
SingleOrDefault
应立即将查询发送到数据库

public HttpResponseMessage GetPurchaseOrder(int POId)
{
    PurchaseOrder po;
    HttpResponseMessage resp;

    using (PMDataDataContext database = new PMDataDataContext())
    {
        po = database.PurchaseOrders.SingleOrDefault(x => x.POId == POId);
    }

    if (po == null)
    {
        var message = string.Format("id = {0} not found", POId);
        HttpError err = new HttpError(message);
        resp = Request.CreateResponse(HttpStatusCode.NotFound, err);                    
    }
    else
    {
        resp = Request.CreateResponse(HttpStatusCode.OK, po);
    }

    return resp;
}

是的,但是如果您在
PurchaseOrder
中有任何延迟加载的属性,当Web API尝试序列化对象时,EF将尝试从数据库获取数据,为此需要上下文,但它将不可用。

Badri引导我解决了我的问题。当我在代码中放置一个断点并在调试模式下运行时,似乎有一个关联的对象需要获取上下文。当我查看相关属性时,属性PurchaseOrder.Item.ItemCategory给出了ObjectDisposedException


在使用SingleOrDefault调用获取采购订单之前,我将database.DeferredLoadingEnabled=false放置在上面,解决了这个问题。

我想对这个答案进行投票,因为它让我解决了我的问题。但它不允许我,因为我没有足够的声望点。哦,我刚想出来。我没有意识到我可以点击复选标记。