Создание легких прокси-объектов Linq2Sql

Я пытаюсь найти наиболее эффективный способ отправки моих объектов 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-only в частичном учебный класс. Опять же, это кажется расточительным, но я думаю, что это пока лучшее.

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

8.01.2009 11:47:15
1 ОТВЕТ

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

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

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

0
8.01.2009 21:30:27