【问题标题】:Self referencing loop Detected for property in Asp.net MVC with Angular 2使用 Angular 2 检测到 Asp.net MVC 中的属性的自引用循环
【发布时间】:2017-11-23 07:34:29
【问题描述】:
  1. 我创建了一个数据库,因为我有多个表之间存在关系。
  2. 尝试从我的 WEB 应用程序获取数据时,我收到此错误

    "'检测到类型为'System.Data.Entity.DynamicProxies.PrescriptionMaster_2C4C63F6E22DFF8E29DCAC8D06EBAE038831B58747056064834E80E41B5C4E4A'的自引用循环'。路径'[0].Patient.PrescriptionMasters"

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

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

    在 Webconfig.cs 中,但对我没有任何帮助。

请帮帮我,我该怎么办?

【问题讨论】:

标签: json sql-server asp.net-mvc angular2-routing angular2-services


【解决方案1】:

防止这种情况发生的唯一正确方法是不发送实体框架对象(可能包含此类循环)进入 JSON 序列化器(这不太好知道何时停止序列化)。

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

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

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

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

另一方面,还有 AutoMapper 等库。如果您决定需要实际的 ViewModel 类,那么 AutoMapper 将帮助您以非常结构化的方式将 EF 对象映射到这些 ViewModel。

【讨论】:

  • 非常感谢先生,我会试试这个并在它工作时恢复你。
【解决方案2】:

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

HttpConfiguration config = GlobalConfiguration.Configuration;

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

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

【讨论】:

  • 我已将此添加到我的全局 asax 文件中,但我仍然遇到同样的问题。
猜你喜欢
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2016-04-17
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多