0

谁能告诉我为什么以下代码在 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;
    }
4

3 回答 3

0

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

于 2013-08-09T08:07:50.323 回答
0

尝试一下,以便在查询后立即处理数据库的上下文。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;
}
于 2013-08-09T07:30:55.207 回答
0

巴德里带领我解决了我的问题。当我在代码中放置断点并进入调试模式时,似乎其中一个关联对象需要获取上下文。当我查看相关属性时,属性 PurchaseOrder.Item.ItemCategory 给出了 ObjectDisposedException。

我通过在使用 SingleOrDefault 调用获取 po 之前放置 database.DeferredLoadingEnabled = false 来解决它。

于 2013-08-11T02:51:24.610 回答