实体框架4.1,MVC3 JsonResult和循环引用

时间:2011-04-15 14:11:02

标签: json asp.net-mvc-3 entity-framework-4.1

我正在尝试使用ASP.NET MVC3学习实体框架代码优先开发。

假设我有一个简单的拍卖和投标数据模型,我想查询所有拍卖及其出价。

我已关闭LazyLoadingEnabled和ProxyCreationEnabled。

这是我的代码:

public class MiCoreDb2Context : DbContext
{
    public MiCoreDb2Context()
        : base()
    {
        this.Configuration.LazyLoadingEnabled = false;
        this.Configuration.ProxyCreationEnabled = false;
    }

    public DbSet<Auction> Auctions { get; set; }
    public DbSet<Bid> Bids { get; set; }
}

public class Auction
{
    public int AuctionId { get; set; }
    public virtual ICollection<Bid> Bids { get; set; }
}

public class Bid
{
    public long BidId { get; set; }
    public int AuctionId { get; set; }

    [ForeignKeyAttribute("AuctionId")]
    public virtual Auction Auction { get; set; }
}


public JsonResult Thing()
{
    List<Auction> auctions;

    using (var db = new MiCoreDb2Context())
    {
        var auctions = (from a in db.Auctions.Include("Bids") select a).ToList();
    }

    return Json(auctions, JsonRequestBehavior.AllowGet);
}

加载页面时,会出现循环引用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

  

加载页面时,会出现循环引用。我该如何解决这个问题?

通过使用视图模型(以及您对ASP.NET MVC可能遇到的任何问题的答案:-))。 Ayende Rahien对此话题有excellent series of blog posts

结论:绝对总是将视图模型传递给视图或从视图中获取视图模型。绝对不会在视图中传递/获取模型(EF,域,...)。一旦这个基本规则得到尊重,你就会发现一切都有效。

答案 1 :(得分:0)

我通过在Linq to Entities查询中进行投影来解决此问题。这将创建匿名类型,可以序列化为json而不会出现任何循环引用问题。

var result = 
from Item in dbContext.SomeEntityCollection
where SomePredicate
select new { Property1 = Item.Property1, Property2 = Item.Property2  };

Return Json(result, JsonRequestBehavior.AllowGet);

鲍伯