Entity Framework 4.1, MVC3 JsonResult и циркулярные ссылки - PullRequest
1 голос
/ 15 апреля 2011

Я пытаюсь освоить разработку 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);
}

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

Ответы [ 2 ]

8 голосов
/ 15 апреля 2011

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

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

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

0 голосов
/ 30 сентября 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);

BOB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...