Как сериализовать автоматически сгенерированный объект EF POCO, чтобы избежать циклических ссылок? - PullRequest
4 голосов
/ 14 декабря 2011

Я использую библиотеку (Telerik) для ASP.NET MVC 3.

У меня проблема со всеми функциями, из-за которых AJAX должен возвращать некоторые данные:

I 'Я использую EF4 для подключения к моей базе данных, и у меня есть (и мне нужны) свойства навигации обоими способами (представьте, что у пользователя есть несколько сообщений и у одного сообщения есть пользователь).

Проблема в том, что библиотекаиспользует JavaScriptSerializer, который кодирует данные с помощью JSON.

Ошибка, которую я получаю

Обнаружена циклическая ссылка при сериализации объекта типа 'System.Data.Entity.DynamicProxies,, но ничего, что полностью удовлетворяло бы меня:

  • Использовать привязку сервера данных: не может, функциональность должна работать в ajax (это пейджер для сетки, which загружает следующие элементы, когда страница прокручивается до конца)
  • Использовать анонимные объекты: не гибкий, потому что, если у меня есть поле в базе данных, я должен добавить его во все свои анонимныеобъект, и, кроме того, если мне нужно иметь подколлекцию, которую я хочу, скучно также создавать объекты для всех элементов этого подсписка.
  • Использовать ViewModel: почти такая же проблема, если она у меня есть.больше поля, я должен добавить эти поля во все viewModel, и я должен создать модель представления для всех моих 60 видов, с точно такими же полями, что и моя модель, ...
  • Использовать атрибут NonSerializedAttribute:Я не знаю, как вставить в мой шаблон T4, который генерирует мои объекты POCO, и я не уверен, что это сработает: иногда главный объект - это дети, иногда - родитель, пустые отношения должны быть другими.

У меня была почти такая же проблема с WCF, и я создал сериализованный, который знает, как обрабатывать циклические ссылки, можем ли мы сделать то же самое здесь?Или есть способ управлять этим?

Если нет, я полагаю, что лучший способ - это использовать "ViewModel", но есть ли способ ускорить это создание?Как универсальный объект, который принимает в конструкторе объект EF и удаляет циклическую ссылку?что-нибудь еще?

Большое спасибо

1 Ответ

5 голосов
/ 14 декабря 2011

На самом деле, вместо [NonSerialized], вам понадобится [ScriptIgnore]. Я бы подошел к этому с одной из двух точек зрения:

  1. используйте RegisterConverters и напишите пользовательский преобразователь, который задает все свойства , за исключением родительского (это может быть , вероятно, также автоматизировано, может быть, использовать сделанный на заказ атрибут уровня класса, такой как [SkipSerialize("Parent")], добавленный в partial class - это, вероятно, слишком усложняет ситуацию).

  2. просто: не сериализуйте EF POCO, а вместо этого используйте DTO - оно звучит , как будто это то, что вы имеете в виду в своем ответе ViewModel. Лично у меня нет проблем с наличием «классовой» (EF / POCO) версии класса и очень похожей, но другой версии DTO - их намерения разные, и, на мой взгляд, они не нарушают DRY.

...