Я экспериментировал с созданием веб-сайта, который использует MVC с JSON для моего уровня представления и Entity Framework для модели данных / базы данных. Моя проблема вступает в игру с сериализацией моих объектов Model в JSON.
Я использую код первый метод для создания моей базы данных. При выполнении первого метода кода отношение один ко многим (родитель / потомок) требует, чтобы у потомка была ссылка на родителя. (Пример кода может быть опечаткой, но вы получите картину)
class parent
{
public List<child> Children{get;set;}
public int Id{get;set;}
}
class child
{
public int ParentId{get;set;}
[ForeignKey("ParentId")]
public parent MyParent{get;set;}
public string name{get;set;}
}
При возврате «родительского» объекта через JsonResult выдается ошибка циклической ссылки, поскольку у «потомка» есть свойство класса parent.
Я пробовал атрибут ScriptIgnore, но я теряю способность смотреть на дочерние объекты. Мне нужно будет отображать информацию в родительском дочернем виде в какой-то момент.
Я попытался сделать базовые классы для родителей и детей, которые не имеют циклическую ссылку. К сожалению, когда я пытаюсь отправить baseParent и baseChild, они читаются JSON Parser как их производные классы (я уверен, что эта концепция ускользает от меня).
Base.baseParent basep = (Base.baseParent)parent;
return Json(basep, JsonRequestBehavior.AllowGet);
Единственное решение, которое я придумала, - это создание моделей «View». Я создаю простые версии моделей базы данных, которые не включают ссылку на родительский класс. Каждая из этих моделей представления имеет метод для возврата версии базы данных и конструктор, который принимает модель базы данных в качестве параметра (viewmodel.name = databasemodel.name). Этот метод кажется принудительным, хотя он работает.
ПРИМЕЧАНИЕ: я публикую здесь, потому что думаю, что это более достойное обсуждение. Я мог бы использовать другой шаблон проектирования, чтобы преодолеть эту проблему, или это могло быть так же просто, как использование другого атрибута в моей модели. В своих поисках я не нашел хорошего способа преодолеть эту проблему.
Моей конечной целью было бы иметь красивое приложение MVC, которое активно использует JSON для связи с сервером и отображения данных. Поддерживая постоянную модель в разных слоях (или настолько, насколько я могу придумать).
источник
Более простой альтернативой попытке сериализации объектов было бы отключение сериализации родительских / дочерних объектов. Вместо этого вы можете сделать отдельный вызов для извлечения связанных родительских / дочерних объектов по мере необходимости. Это не может быть идеальным для вашего приложения, но это вариант.
Для этого вы можете установить DataContractSerializer и установить для свойства DataContractSerializer.PreserveObjectReferences значение false в конструкторе класса вашей модели данных. Это указывает на то, что ссылки на объекты не должны сохраняться при сериализации ответов HTTP.
Примеры:
Формат Json:
Формат XML:
Это означает, что если вы выбираете элемент, на который ссылаются дочерние объекты, дочерние объекты не будут сериализованы.
Смотрите также класс DataContractsSerializer .
источник
Сериализатор JSON, работающий с циркулярными ссылками
Вот пример пользовательского Джексона,
JSONSerializer
который имеет дело с циклическими ссылками путем сериализации первого вхождения и сохранения *reference
в первом вхождении во всех последующих вхождениях.Работа с круговыми ссылками при сериализации объектов с Джексоном
Соответствующий частичный фрагмент из вышеуказанной статьи:
источник
Отправка минимального количества данных является единственным правильным ответом. Когда вы отправляете данные из базы данных, обычно не имеет смысла отправлять каждый столбец со всеми связями. Потребителям не нужно иметь дело с ассоциациями и структурами баз данных, то есть для баз данных. Это не только сэкономит пропускную способность, но и облегчит обслуживание, чтение и использование. Запросите данные, а затем смоделируйте их для того, что вам действительно нужно отправить. голый минимум.
источник
.Include(x => x.TableName )
не возвращая отношения (из основной таблицы в зависимую таблицу) или возвращая только одну строку данных, ИСПРАВИТЕ ЗДЕСЬ:/programming/43127957/include-not-working-in-net-core-returns-one-parent
Кроме того, в Startup.cs убедитесь, что это вверху:
источник