Создание легких прокси-объектов Linq2Sql - PullRequest
0 голосов
/ 08 января 2009

Я пытаюсь найти наиболее эффективный способ отправки моих объектов Linq2Sql в мои плагины jQuery через JSON, желательно без дополнительного кода для каждого класса.

EntitySets являются основной проблемой, поскольку они вызывают не только рекурсию, но и когда игнорируется рекурсия (с помощью функции ReferenceLoopHandling JSON.NET ), когда я только на самом деле могу получить глупый объем данных нужно 1 или 2 уровня. Это очень плохо, когда вы говорите о пользователях, ролях и разрешениях, когда вы получаете роль пользователя, разрешения пользователя, разрешения роли и всех пользователей роли в вашем JSON, прежде чем он достигнет рекурсии и остановится. Сравните это с тем, что я на самом деле хочу, это просто RoleId.

Мой первоначальный подход состоял в том, чтобы отправить «упрощенную» версию объекта, где я отражаю сущность и устанавливаю для любых EntitySets значение null, но, конечно, в приведенном выше примере Roles устанавливается в значение null, и поэтому RoleId имеет значение null. Установка только свойств 2-го уровня для нулевого вида работ, но все еще слишком много данных, так как неубранные наборы EntitySet (первого уровня) повторно заполняют связанные с ними таблицы, когда JsonSerializer делает свое отражение, и я все еще получаю все те объекты Permission, которые Мне просто не нужно.

Я определенно не хочу попадать в ситуацию создания облегченной версии каждого класса и реализации для них методов стиля «От» и «Кому», так как это большая работа и кажется расточительной.

Другой вариант - добавить атрибут JsonIgnoreAttribute в соответствующие свойства, но это приведет к кошмарному сценарию всякий раз, когда классы необходимо будет заново сгенерировать.

Мое любимое решение, которое я люблю и ненавижу одновременно, - перевести классы в режим opt-in serialization, но поскольку я не могу добавить атрибуты к реальным свойствам, мне придется создавать свойства только для JSON в частичном классе. Опять же, это кажется расточительным, но я думаю, что это пока лучшее.

Любые предложения с благодарностью приняты!

1 Ответ

0 голосов
/ 09 января 2009

Вы пытались установить режим сериализации в файле dbml?

Это стандартное свойство при генерации кода, и когда вы установите его в однонаправленный режим, оно не будет генерировать все дополнительные уровни структуры вашей таблицы. Я использовал это с silverlight и WCF для отправки данных, потому что контракты на данные не позволяют отправлять дополнительные уровни (silverlight очень ограничен в том, что вы можете и не можете делать).

Надеюсь, это поможет!

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