2013-06-27 36 views
1

当我有一个许多实体框架5的Code First模型一对多的关系 即EF5与多对多的关系序列化到JSON

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,但这是一种无关紧要的),这会造成严重破坏。

我试过将懒惰加载关闭,当我得到我的产品时,我使用了include;

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

但是,这仍然然后执行每个类别内的产品的递归聚集。

任何想法?

Regards

回答

2

您也可以使用业务对象,而不是直接使用数据库对象。通过这种方式,你只能从侧面引用,说:

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

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

} 
1

您可以参考Product和Category之间的循环。 换言之,产品与类别和类别具有与产品的关系。 所以,你需要做的是删除这些关系之一。

我会做些事情那样:

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

我希望它能帮助。

+0

谢谢!两个答案都会做我所需要的!我有点希望不使用商业或观看模型,但最终我认为这可能是最好的解决这个问题。 – BrettH

+0

再次 - 谢谢你们两位! – BrettH

+0

不客气,BrettH。 – Damien

0

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

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

如果你想对现有数据的引用,那么你看看修复2在this article

相关问题