网络核心 - .INCLUDE()导致循环造成的Visual Studio调试崩溃
问题描述:
我的数据库有网络核心 - .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。
我该如何避免它?
答
为了检索LINQ查询您的结果可以解决这些方面的问题:
- 配置您的串行忽略循环
- 为您的控制器的动作
- 使用匿名视图模型键入从你的控制器的动作中选择结果
+0
***“为您的控制器的行为创建视图模型”的答案解决了问题我有。 –
在这种情况下,您需要创建一个匿名类型以避免序列化时出现无限循环,或者设置您的序列化程序忽略lo ops –
是的,它似乎是一个已知的问题:https://github.com/aspnet/EntityFramework/issues/7564 它是MVC相关的,可以通过忽略启动时的序列化循环“解决”: services.AddMvc ().AddJsonOptions(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); – alessalessio
因此,在这一刻你可以解决你的要求,创建一个视图模型或匿名类型,你解决了吗? –