#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);
Боб