在 Asp.net MVC 中检测到 属性 的自引用循环 Angular 2

Self referencing loop Detected for property in Asp.net MVC with Angular 2

  1. 我已经创建了一个数据库,因为我有多个表,它们之间有关系。
  2. 当尝试从我的 WEb 应用程序获取数据时出现此错误

    "'Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.PrescriptionMaster_2C4C63F6E22DFF8E29DCAC8D06EBAE038831B58747056064834E80E41B5C4E4A'. Path '[0].Patient.PrescriptionMasters"

  3. 我不明白为什么会出现此错误,当我删除表之间的关系时,我会从中获得正确的数据。
  4. 我尝试过其他解决方案,例如添加

    "config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; “

    在 Webconfig.cs 但对我没有任何作用。

请帮帮我,我该怎么办?

只需将此添加到 Global.asax 中的 Application_Start:

HttpConfiguration config = GlobalConfiguration.Configuration;

config.Formatters.JsonFormatter
            .SerializerSettings
            .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

它将忽略指向对象的引用。

防止这种情况发生的唯一正确方法是不发送Entity Framework对象(可能包含此类循环)到JSON Serializer(不太擅长知道何时停止序列化)。

相反,创建模仿前端实际需要的 EF 对象部分的 ViewModel,然后使用 EF 对象填充这些 ViewModel。

一种简单快捷的方法是只使用匿名对象,例如:

return new
{
    Product = new
    {
        Id = EF_Product.Id,
        Name = EF_Product.Name
    }
};

一个好的经验法则是仅将 EF 对象的简单属性(数字、布尔值、字符串、日期时间)分配给 ViewModel 项。一旦您遇到一个 EF 对象 属性 是另一个 EF 对象(或 EF 对象的集合),那么您还需要将它们转换为未链接到 EF 的 'simple' 对象。

在频谱的另一端,有诸如 AutoMapper 之类的库。如果您决定需要实际的 ViewModel 类,那么 AutoMapper 将帮助以非常结构化的方式将 EF 对象映射到那些 ViewModel。