Asp.net mvc 具有多对多关系的EF5在序列化为JSON时创建循环引用
我有一个实体框架5代码优先模型,具有多对多关系 i、 e 但这仍然是在每个类别中执行产品的递归收集 有什么想法吗Asp.net mvc 具有多对多关系的EF5在序列化为JSON时创建循环引用,asp.net-mvc,json,entity-framework,knockout.js,Asp.net Mvc,Json,Entity Framework,Knockout.js,我有一个实体框架5代码优先模型,具有多对多关系 i、 e 但这仍然是在每个类别中执行产品的递归收集 有什么想法吗 关于您在产品和类别之间有参考循环。 换句话说,产品和类别有关系,类别和产品有关系。 所以,您需要做的是删除其中一个关系 我会做这样的事情: var categoriesGraph = db.Categories.Include("Products").ToList(); var data = categoriesGraph.Select(c => new { c.Cat
关于您在产品和类别之间有参考循环。 换句话说,产品和类别有关系,类别和产品有关系。 所以,您需要做的是删除其中一个关系 我会做这样的事情:
var categoriesGraph = db.Categories.Include("Products").ToList();
var data = categoriesGraph.Select(c => new
{
c.CategoryId,
Products = c.Products.Select(p = > new {
p.ProductId,
CategoriesID = p.Categories.Select(c => c.CategoryId).ToArray(),
// don't add the categories.
}).ToArray()
}).ToArray();
我希望它能有所帮助。您在产品和类别之间有参考循环。 换句话说,产品和类别有关系,类别和产品有关系。 所以,您需要做的是删除其中一个关系 我会做这样的事情:
var categoriesGraph = db.Categories.Include("Products").ToList();
var data = categoriesGraph.Select(c => new
{
c.CategoryId,
Products = c.Products.Select(p = > new {
p.ProductId,
CategoriesID = p.Categories.Select(c => c.CategoryId).ToArray(),
// don't add the categories.
}).ToArray()
}).ToArray();
我希望它能有所帮助。您也可以使用业务对象,而不是直接使用数据库对象。以这种方式,您只能从侧面引用,例如:
Public class Product
{
public int ProductId {get;set;}
public IList<Category> Categories {get;set;}
}
Public class Category
{
public int CategoryId {get;set;}
}
公共类产品
{
public int ProductId{get;set;}
公共IList类别{get;set;}
}
公共类类别
{
public int CategoryId{get;set;}
}
您还可以使用业务对象,而不是直接使用数据库对象。以这种方式,您只能从侧面引用,例如:
Public class Product
{
public int ProductId {get;set;}
public IList<Category> Categories {get;set;}
}
Public class Category
{
public int CategoryId {get;set;}
}
公共类产品
{
public int ProductId{get;set;}
公共IList类别{get;set;}
}
公共类类别
{
public int CategoryId{get;set;}
}
您可以告诉Json.Net忽略循环引用:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
如果您希望引用现有数据,请查看中的修复程序2,您可以告诉Json.Net忽略循环引用:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
如果您希望引用现有数据,请查看中的修复程序2,谢谢!两个答案都可以满足我的需要!我有点希望不使用业务或视图模型,但最终我认为这可能是解决这个特定问题的最佳方法。谢谢!两个答案都可以满足我的需要!我有点希望不使用业务或视图模型,但最终我认为这可能是解决这个特定问题的最佳方法。