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

#json #asp.net-mvc-3 #entity-framework-4.1

#json #asp.net-mvc-3 #entity-framework-4.1

Вопрос:

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

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

Ответ №1:

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

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

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

Ответ №2:

Я решил эту проблему, выполнив проекцию в запросе Linq к сущностям. Это создаст анонимные типы, которые могут быть сериализованы в json без каких-либо проблем с циклическими ссылками.

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

Return Json(result, JsonRequestBehavior.AllowGet);
  

Боб