C# 在ASP.NET MVC 2 Web应用程序中将LINQ输出到关系为JSON的SQL实体时出现循环引用错误
这是我的dbml文件的设计视图截图 这些关系由表上的外键自动生成 当我尝试将查询结果序列化为JSON时,我得到一个循环引用错误..: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(
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);