获取错误:序列化“Abc.Models.ProductItem”类型的对象时检测到循环引用

时间:2017-04-13 11:48:03

标签: asp.net-mvc entity-framework

我正在寻找ProuctId.i的编辑数据有2个表像Product和productitems.so我点击编辑通过获取数据来获取id但是那个时候我在产品表中通过id获取数据正在获得支持但是在找到列表后,productitems数据就像这个错误一样。

这是我的ProductItmes类:

[Table("ProductItems ")]
public class ProductItems 
  {
   [Key]
public int id { get; set; }

[ForeignKey("Products")]
public int pid {get; set;}

public int Qty { get; set; }

public Decimal Rate { get; set; }

public virtual Products Products { get; set; }
 }

这是我的api方法:

public ActionResult GetProductByid(int id)
{

 var Pro = db.Product.Find(id);
 var ProItemList = db.Promotion_ctc.Where(x => x.pid == Pro.id).ToList();//here i am getting list of items by productid

 var Details = new
 {
    Pro.id,
    Pro.name,
    Pro.image_url,
    ProItemList 
     };

    return Json(new { data = Details });            
  }

idk我的问题在哪里,任何人都知道,请告诉我。

2 个答案:

答案 0 :(得分:1)

在使用MVC和Entity Framework时,有些情况下我们通过在此处声明此属性,让我们的子实体像您一样引用父实体:

public virtual Products Products { get; set; }

对于实体框架来说没问题,但是当你尝试序列化这个时它不是。

发生了什么:

  • 序列化程序将尝试序列化父级,其父集合为ProductItem
  • 序列化程序尝试序列化每个孩子。
  • 子项具有父项的引用,因此序列化程序会尝试再次序列化父项。
  • 无限循环。

这就是人们使用ViewModels的原因。而不是仅仅从您的操作返回您的实体,将它们投影到视图模型中,然后返回它。实际上,您返回的是一个包含ProItemList的匿名对象,我猜它是List ProductItems。只需为它创建一个视图模型:

public class ProductItemViewModel 
{

    public int ItemId { get; set; }

    public int ProductId {get; set;}

    public int Qty { get; set; }

    public Decimal Rate { get; set; }

    // public virtual Products Products { get; set; } NO PRODUCT HERE
 }

...然后修复您的操作以返回List ProductItemViewModel,而不是直接返回ProductItems,如下所示:

var ProItemList = db.Promotion_ctc.Where(x => x.pid == Pro.id)
.Select(i => new ProductItemViewModel
{
    ItemId = i.ItemId,
    ProductId = i.ProductId,
    Qty = i.Qty,
    Rate = i.Rate
})
.ToList();

var Details = new
{
    Pro.id,
    Pro.name,
    Pro.image_url,
    ProItemList 
     };

    return Json(new { data = Details });            
}

答案 1 :(得分:0)

仅将必需的列发送到ui

像这样

 var passToUi = from s in listResult
                select new { s.Id, s.Name };

 return Json(passToUi, JsonRequestBehavior.AllowGet);