我正在尝试使用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);
}
加载页面时,会出现循环引用。我该如何解决这个问题?
答案 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);
鲍伯