Entity Framework 4.1, MVC3 JsonResult и циклические ссылки

Я пытаюсь изучить разработку Entity Framework Code First с помощью 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);
}

Когда я загружаю страницу, возникает циклическая ссылка. Как я обойду это?


person sf.    schedule 15.04.2011    source источник


Ответы (2)


Когда я загружаю страницу, возникает циклическая ссылка. Как я обойду это?

Используя модели представлений (и, кстати, это ответ на любой вопрос, который может у вас возникнуть относительно ASP.NET MVC :-)). У Айенде Рахиен есть отличная серия сообщений в блоге по этой теме.

Вывод: абсолютно всегда передавайте/берите модели представления в/из представления. Абсолютно никогда не передавайте/извлекайте модели (EF, домен, ...) в/из представления. Как только это фундаментальное правило будет соблюдаться, вы обнаружите, что все работает.

person Darin Dimitrov    schedule 15.04.2011

Я решил эту проблему, выполнив проекцию в запросе 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);

БОб

person PilotBob    schedule 30.09.2011