Ошибка циклической ссылки при выводе сущностей LINQ to SQL со связями в виде JSON в веб-приложении ASP.NET MVC 2 - PullRequest
4 голосов
/ 12 апреля 2010

Вот скриншот моего dbml-файла в виде дизайна.

Отношения автоматически генерируются внешними ключами в таблицах.

http://i39.tinypic.com/2e2p0kj.jpg

Когда я пытаюсь сериализовать результат запроса в JSON, я получаю ошибку циклической ссылки ..:

public ActionResult Index()
{
    return Json(new DataContext().Ingredients.Select(i => i));
}


Но если я создаю свою собственную коллекцию "голых" Ingredient объектов, все работает нормально ..:

public ActionResult Index()
{
    return Json(new Entities.Ingredient[]
    {
        new Entities.Ingredient(),
        new Entities.Ingredient(),
        new Entities.Ingredient()
    });
}

... Также; Сериализация работает нормально, если я удаляю связи на своих таблицах.


Как я могу сериализовать объекты со связями, не обращаясь к сторонней библиотеке?

Я прекрасно справляюсь с простой сериализацией объектов "верхнего уровня" данной коллекции ... То есть; без сериализации отношений.

Ответы [ 3 ]

4 голосов
/ 12 апреля 2010

В большинстве случаев, связанных с проблемами сериализации, самое простое, что нужно сделать, - это преобразовать данные в простую модель DTO, которая моделирует именно то, что вы хотите (а не те биты, которые у вас нет). Так что имейте класс MyDtos.Ingredient, который выглядит как ваш класс Whatever.Ingredient, но у которого нет отношений, которые вам не нужны. LINQ хорош в этом:

var mapped = from i in ingredients
             select new MyDtos.Ingredient {
                Id = i.Id, Name = i.Name, ...
             };

Вы также можете посмотреть AutoMapper или операторы неявного преобразования, чтобы сделать то же самое без необходимости писать слишком много дополнительного кода отображения каждый раз.

2 голосов
/ 05 июля 2012

Это поздний ответ, но вы всегда можете преобразовать класс LINQ в анонимный тип, включающий свойства, которые вы хотите использовать в JSON. * 1001 то есть *

public ActionResult Index()
{
    return Json(new DataContext().Ingredients.Select(i => new {
        Name = i.Name,
        UnitName = i.UnitName,
        UnitAmount = i.UnitAmount
    }));
}
0 голосов
/ 29 января 2016

Это потому, что он пытается загрузить дочерние объекты и может создать какой-то круговой цикл, который никогда не закончится (a => b, b => c, c => d, d => a)

вы можете отключить его только на данный конкретный момент, как показано ниже. Поэтому dbcontext не будет загружать дочерние объекты клиентов, если для вашего объекта не вызывается метод Include

используйте нечто похожее на это ..

  db.Configuration.ProxyCreationEnabled = false;
  User ma = db.user.First(x => x.u_id == id);
  return Json(ma, JsonRequestBehavior.AllowGet);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...