C# 在ASP.NET MVC 2 Web应用程序中将LINQ输出到关系为JSON的SQL实体时出现循环引用错误

C# 在ASP.NET MVC 2 Web应用程序中将LINQ输出到关系为JSON的SQL实体时出现循环引用错误,c#,asp.net-mvc,generics,serialization,asp.net-mvc-2,C#,Asp.net Mvc,Generics,Serialization,Asp.net Mvc 2,这是我的dbml文件的设计视图截图 这些关系由表上的外键自动生成 当我尝试将查询结果序列化为JSON时,我得到一个循环引用错误..: public ActionResult Index() { return Json(new DataContext().Ingredients.Select(i => i)); } 但是,如果我创建自己的“裸”component对象集合,一切都会很好 public ActionResult Index() { return Json(

这是我的dbml文件的设计视图截图

这些关系由表上的外键自动生成

当我尝试将查询结果序列化为JSON时,我得到一个循环引用错误..:

public ActionResult Index()
{
    return Json(new DataContext().Ingredients.Select(i => i));
}

但是,如果我创建自己的“裸”
component
对象集合,一切都会很好

public ActionResult Index()
{
    return Json(new Entities.Ingredient[]
    {
        new Entities.Ingredient(),
        new Entities.Ingredient(),
        new Entities.Ingredient()
    });
}
。。。也;如果删除表上的关系,序列化工作正常。


如何序列化具有关系的对象,而不必求助于第三方库


我完全可以序列化给定集合的“顶级”对象。。就是,;没有关系也被序列化。

在大多数涉及序列化问题的情况下,最简单的方法是将数据转换为一个简单的DTO模型,该模型精确地模拟了您想要的(而不是您不想要的位)。因此,有一个
MyDtos.component
类,它看起来像你的
which.component
类,但没有你不想要的关系。LINQ擅长于:

var mapped = from i in ingredients
             select new MyDtos.Ingredient {
                Id = i.Id, Name = i.Name, ...
             };

您也可以查看或隐式转换运算符来执行相同的操作,而不必每次编写太多额外的映射代码。

这是一个迟来的答案,但您始终可以将LINQ类转换为包含JSON中所需属性的anoynmous类型。i、 e

public ActionResult Index()
{
    return Json(new DataContext().Ingredients.Select(i => new {
        Name = i.Name,
        UnitName = i.UnitName,
        UnitAmount = i.UnitAmount
    }));
}

这是因为它正在尝试加载子对象,并且可能正在创建一些永不结束的循环(a=>b,b=>c,c=>d,d=>a)

您只能在特定时刻关闭它,如下所示

使用类似的东西

  db.Configuration.ProxyCreationEnabled = false;
  User ma = db.user.First(x => x.u_id == id);
  return Json(ma, JsonRequestBehavior.AllowGet);