1

我的數據庫有網絡核心 - .INCLUDE()導致循環造成的Visual Studio調試崩潰

Database diagram

這被建模爲「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對象的列表,我可以調試過程中,通過導航: usage record

請注意,Dimension對象爲空,這是正確的,因爲我沒有把它包含在查詢中。現在

,如果我嘗試包括它,應用程序崩潰:「?」

_context.Set<UsageRecord>.Where(x => x.ProductId == productId).Include(p => p.Dimension).ToList(); 

crash

郵差退出了502錯誤,並且VS調試首先顯示的問號清單在崩潰之前。

我認爲這是由於這樣一個事實,即通過包含Dimension對象,這個循環遍歷附加的UsageRecords列表,然後再次遍歷Dimension。

我該如何避免它?

+0

在這種情況下,您需要創建一個匿名類型以避免序列化時出現無限循環,或者設置您的序列化程序忽略lo ops –

+0

是的,它似乎是一個已知的問題:https://github.com/aspnet/EntityFramework/issues/7564 它是MVC相關的,可以通過忽略啓動時的序列化循環「解決」: services.AddMvc ().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); – alessalessio

+0

因此,在這一刻你可以解決你的要求,創建一個視圖模型或匿名類型,你解決了嗎? –

回答

1

爲了檢索LINQ查詢您的結果可以解決這些方面的問題:

  • 配置您的串行忽略循環
  • 爲您的控制器的動作
  • 使用匿名視圖模型鍵入從你的控制器的動作中選擇結果
+0

***「爲您的控制器的行爲創建視圖模型」的答案解決了問題我有。 –