网络核心 - .INCLUDE()导致循环造成的Visual Studio调试崩溃

问题描述:

我的数据库有网络核心 - .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

因此,在这一刻你可以解决你的要求,创建一个视图模型或匿名类型,你解决了吗? –

为了检索LINQ查询您的结果可以解决这些方面的问题:

  • 配置您的串行忽略循环
  • 为您的控制器的动作
  • 使用匿名视图模型键入从你的控制器的动作中选择结果
+0

***“为您的控制器的行为创建视图模型”的答案解决了问题我有。 –