簡體   English   中英

C#Entity Framework 6與ASP.Net Web API在JSON響應中返回空數組

[英]C# Entity Framework 6 with ASP.Net web API returning empty array in JSON response

這是我在“Works Orders”控制器中用來處理GET請求的代碼:

    // GET: api/WorksOrders/5
    /// <summary>
    /// Fetches the Works Order with corresponding ID (pkOrderItemID)
    /// </summary>
    [Authorize]
    public OrderItem Get(int id)
    {
        using (var entities = new customappsEntities())
        {
            return entities.OrderItems.FirstOrDefault(e => e.pkOrderItemID == id);
        }
    }

運行此命令時,我在JSON響應中收到此錯誤消息:

 "Error getting value from 'OrderItemDepartments' on 'System.Data.Entity.DynamicProxies.OrderItem_501562E50E13B847D4A87F7F2DEC7C8CEDAF127355CB4FC30E12653275CE6412'.",

我可以通過添加來解決這個問題

entities.Configuration.ProxyCreationEnabled = false;

這將返回整個表,但底部有一組空數組,例如JSON格式的響應如下所示:

{
  "$id": "1",
  "pkOrderItemID": 271,
  "StartedOn": "2015-01-01T00:00:00",
  "CompletedOn": "2014-10-15T00:00:00",
  "Costs": [],
  "Dispatches": []
}

數組似乎是數據庫中的外鍵關系,我相信它們會返回空,因為它被卡在自引用循環中(我能夠獲得該錯誤消息幾次,但我無法重新創建它)。 我試過添加

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Re‌​ferenceLoopHandling = ReferenceLoopHandling.Ignore;

發件人: 檢測到自引用循環 - 從WebApi返回數據到瀏覽器

來自相同或類似線程的許多其他解決方案但它沒有解決問題。 我的所有數據類都是由Entity Framework自動生成的,所以我無法修改它們,也許這是設置Web API的錯誤方法?

任何幫助,以弄清楚數組返回空的原因將不勝感激。 謝謝。

更新

這是顯示fk關系的DataModel Diagram的屏幕截圖

這是顯示fk關系的DataModel Diagram的屏幕截圖

不要通過JSON序列化返回POCO或匿名對象以外的任何內容。 實體框架對象具有您不希望看到的巨大開銷,並且通常具有串行器無法處理的循環關系(並且您不希望,即使您將其配置為允許它們)。

創建POCO或返回選擇:

[Authorize]
public MyOrderItem Get(int id)
{
    using (var entities = new customappsEntities())
    {
        var item = entities.OrderItems.FirstOrDefault(e => e.pkOrderItemID == id);
        return new MyOrderItem()
        {
             StartedOn = item.StartedOn,
             ...
        };
    }
}

正確使用JSON的關鍵是只返回整行所需的內容

更新

由於項目包含子項目,您還需要確保您也擁有POCO:

例如

var myOrderItem = new MyOrderItem()
{
     StartedOn = item.StartedOn,
     Costs = new List<MyCost>();  // <=== This can also go in the default constructor
     ...
};
foreach (var cost in item.Costs)
{
     myOrderItem.Costs.Add(new MyCost()
     {
         Value = cost.Value
         ...
     });
}
return myOrderItem;

另一個更新

這很奇怪。 它當然應該給你你的記錄。 您還可以使用.Select()FirstOrDefault()而不僅僅是FirstOrDefault()來嘗試使用.Include()來保證相關記錄已預先加載。

例如:

entities.OrderItems.Include(x=>x.Costs).Select(x=>x).FirstOrDefault();

添加Newtonsoft Json Library並返回這樣的結果

JsonSerializerSettings jss = new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore };
    return JsonConvert.SerializeObject(result, Formatting.Indented, jss);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM