Asp.net mvc 具有多对多关系的EF5在序列化为JSON时创建循环引用

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

我有一个实体框架5代码优先模型,具有多对多关系 i、 e

但这仍然是在每个类别中执行产品的递归收集

有什么想法吗


关于

您在产品和类别之间有参考循环。 换句话说,产品和类别有关系,类别和产品有关系。 所以,您需要做的是删除其中一个关系

我会做这样的事情:

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,谢谢!两个答案都可以满足我的需要!我有点希望不使用业务或视图模型,但最终我认为这可能是解决这个特定问题的最佳方法。谢谢!两个答案都可以满足我的需要!我有点希望不使用业务或视图模型,但最终我认为这可能是解决这个特定问题的最佳方法。