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

时间:2017-11-23 07:34:29

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

  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中,但没有任何对我有用。

  5. 请帮助我,我该怎么办?

2 个答案:

答案 0 :(得分:3)

防止这种情况发生的唯一正确方法是不将实体框架对象(可能包含此类循环)发送到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。

答案 1 :(得分:1)

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

即可
HttpConfiguration config = GlobalConfiguration.Configuration;

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

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