Asp.net core mvc Net核心-.Include()导致循环导致Visual Studio调试崩溃

Asp.net core mvc Net核心-.Include()导致循环导致Visual Studio调试崩溃,asp.net-core-mvc,entity-framework-core,dbcontext,visual-studio-2017,eager-loading,Asp.net Core Mvc,Entity Framework Core,Dbcontext,Visual Studio 2017,Eager Loading,我的数据库在“UsageRecord”和“Dimension”之间有一对多关系 这建模如下(使用数据库优先的方法): 因此,如果我查询UsageRecords列表(正在加载): \u context.Set.Where(x=>x.ProductId==ProductId.ToList()) 我获得了调试期间可以浏览的UsageRecord对象列表: 请注意,维度对象为null,这是正确的,因为我没有将其包括在查询中 现在,如果我尝试将其包括在内,应用程序将崩溃: _context.Set&

我的数据库在“UsageRecord”和“Dimension”之间有一对多关系

这建模如下(使用数据库优先的方法):

因此,如果我查询UsageRecords列表(正在加载):

\u context.Set.Where(x=>x.ProductId==ProductId.ToList())
我获得了调试期间可以浏览的UsageRecord对象列表:

请注意,维度对象为null,这是正确的,因为我没有将其包括在查询中

现在,如果我尝试将其包括在内,应用程序将崩溃:

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

Postman退出时出现502错误,VS Debug在崩溃之前首先显示问号“?”列表

我认为这是由于这样一个事实,即通过包含维度对象,它会一次又一次地遍历所附的UsageRecords列表,然后遍历维度


如何避免此问题?

为了从LINQ查询中检索结果,您可以通过以下方式解决问题:

  • 将序列化程序配置为忽略循环
  • 为控制器的操作创建视图模型
  • 在控制器的操作中使用“选择结果”中的匿名类型

在这种情况下,您需要创建一个匿名类型,以避免序列化时出现无限循环,或者将序列化程序设置为忽略循环。这似乎是一个已知问题:它与MVC相关,可以通过在启动时忽略序列化时的循环来“解决”:services.AddMvc().AddJsonOptions(options=>options.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore);那么,现在您可以通过创建视图模型或匿名类型来解决您的需求,您解决了吗?我解决了它,这要归功于我之前的评论中提供的链接和代码行。我将根据您的反馈回答“为控制器的操作创建视图模型”解决了我的问题。
      public partial class UsageRecord
        {
            public long Id { get; set; }
            ...
            public long DimensionId { get; set; }    
            public virtual Dimension Dimension { get; set; }              
        }
_context.Set<UsageRecord>.Where(x => x.ProductId == productId).ToList()
_context.Set<UsageRecord>.Where(x => x.ProductId == productId).Include(p => p.Dimension).ToList();