2

我有一个具有多对多关系的实体框架 5 Code First 模型,即

Public class Product
{
    public int ProductId {get;set;}
    public ICollection<Category> Categories {get;set;}
}

Public class Category
{
    public int CategoryId {get;set;}
    public ICollection<Product> Products {get;set;}
}

因此,我正在流利地创建实际关系;

modelBuilder.Entity<Product>()
            .HasMany(p => p.Categories)
            .WithMany(c => c.Products)
            .Map(m =>
                {
                    m.ToTable("ProductsToCategories");
                    m.MapLeftKey("Products_ProductId");
                    m.MapRightKey("ProductCategories_ProductCategoryId");
                });

现在,当我检索我的数据时正在检索产品,并且产品作为一堆类别,但每个类别中也有一堆产品,因此它会递归。

问题是,当我将其序列化为 JSON 以供前端使用时,这会造成严重破坏(我正在使用 KnockOut,但这有点无关紧要)。

我试过关闭延迟加载,当我得到我的产品时,我使用包含;

db.Products.Include("Categories").ToList()

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

有任何想法吗?

问候

4

3 回答 3

3

您还可以使用业务对象而不是直接使用数据库对象。以这种方式,您只能从侧面参考,例如:

Public class Product
{
    public int ProductId {get;set;}
    public IList<Category> Categories {get;set;}
}

Public class Category
{
    public int CategoryId {get;set;}

}
于 2013-06-27T11:22:34.863 回答
1

您在产品和类别之间有参考循环。换句话说,产品与类别有关系,而类别与产品有关系。因此,您需要做的是删除这些关系之一。

我会做这样的事情:

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();

我希望它有所帮助。

于 2013-06-27T11:18:25.280 回答
0

你可以告诉 Json.Net 忽略循环引用:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

如果您想引用现有数据,请查看本文中的修复 2

于 2013-06-27T11:38:50.260 回答