我的數據庫有網絡核心 - .INCLUDE()導致循環造成的Visual Studio調試崩潰
這被建模爲「UsageRecord」和「尺寸」之間的一個一對多的關係如下(使用一個數據庫,第一種方法):
public partial class Dimension
{
...
public virtual ICollection<UsageRecord> UsageRecord { get; set; }
}
使用記錄類:
public partial class UsageRecord
{
public long Id { get; set; }
...
public long DimensionId { get; set; }
public virtual Dimension Dimension { get; set; }
}
所以,如果我查詢UsageRecords(EagerLoading)的列表:
_context.Set<UsageRecord>.Where(x => x.ProductId == productId).ToList()
我得到UsageRecord對象的列表,我可以調試過程中,通過導航:
請注意,Dimension對象爲空,這是正確的,因爲我沒有把它包含在查詢中。現在
,如果我嘗試包括它,應用程序崩潰:「?」
_context.Set<UsageRecord>.Where(x => x.ProductId == productId).Include(p => p.Dimension).ToList();
郵差退出了502錯誤,並且VS調試首先顯示的問號清單在崩潰之前。
我認爲這是由於這樣一個事實,即通過包含Dimension對象,這個循環遍歷附加的UsageRecords列表,然後再次遍歷Dimension。
我該如何避免它?
在這種情況下,您需要創建一個匿名類型以避免序列化時出現無限循環,或者設置您的序列化程序忽略lo ops –
是的,它似乎是一個已知的問題:https://github.com/aspnet/EntityFramework/issues/7564 它是MVC相關的,可以通過忽略啓動時的序列化循環「解決」: services.AddMvc ().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); – alessalessio
因此,在這一刻你可以解決你的要求,創建一個視圖模型或匿名類型,你解決了嗎? –