[英]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.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
發件人: 檢測到自引用循環 - 從WebApi返回數據到瀏覽器
來自相同或類似線程的許多其他解決方案但它沒有解決問題。 我的所有數據類都是由Entity Framework自動生成的,所以我無法修改它們,也許這是設置Web API的錯誤方法?
任何幫助,以弄清楚數組返回空的原因將不勝感激。 謝謝。
更新
這是顯示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.