2010-08-10 2 views
3

У меня есть объект LINQ to SQL, который я буду сериализовать и возвращать как JSON через вызов webservice.ScriptIgnore в LINQ to SQL

В этом объекте есть одно свойство, которое я бы хотел не сериализовать. Для этого обычно существует атрибут [ScriptIgnore], который работает именно так, как я хочу, если я вручную добавлю его в файл designer.cs.

Теперь, поскольку файл конструктора автоматически генерируется, я бы предпочел не вручную его редактировать, так как любые изменения могут быть легко перезаписаны. Таким образом, мой вопрос: есть ли способ аннотировать свойство так, чтобы он был исключен при сериализации, непосредственно в редакторе DBML?

Если ответ отрицательный; есть ли какие-либо решения для этого, которые более аккуратны, чем вручную, устанавливая свойство до null перед его сериализацией или возвращая анонимный тип, идентичный, за исключением одного свойства? В MVC.NET есть ли способ передать параметры в метод JSON(), чтобы изменить его поведение, возможно?

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

ответ

2

Все классы, созданные DBML, являются частичными классами, поэтому вы можете расширить их в другом файле. Дизайнер DBML будет изменять только классы в файле Designer.cs. Удалите свойство из конструктора DBML и поместите его в частичный класс в другой файл. Затем вы можете добавить любые дополнительные атрибуты, и дизайнер DBML оставит его в покое. Вам придется вручную управлять этим свойством и обновлять его в соответствии с любыми изменениями базы данных, но я думаю, что это, вероятно, цена, которая стоит заплатить, если она решает вашу проблему.

+0

Хе-хе, я даже не рассматривал этот вариант. Я предполагаю, что это связано с собственными недостатками в том, чтобы вручную его поддерживать, и чтобы скопировать какой-то довольно громоздкий и обычно машинный код для подключения к логике ORM. Если бы был способ сделать частичные * свойства * и просто расширить их с помощью атрибутов, я бы полностью согласился на это. Думаю, я * мог бы жить с этим, если это мой лучший вариант. +1 на данный момент, но я оставлю вопрос открытым, чтобы узнать, есть ли у кого-нибудь блестящие решения =) –

+0

Все, что вам нужно для поддержания отображения ORM, - это сохранить атрибут столбца, украшающий свойство. Остальная часть сгенерированного кода - более прочная пластина, которая соединяет некоторые события и частичные методы. Если вы не используете события или не реализовали частичные методы, вы можете безопасно удалить этот код, и он не будет иметь никакого эффекта, кроме как удалить вашу способность использовать их позже. Как только это будет сделано, вы управляете довольно простым свойством и довольно простым атрибутом. –

+0

@Ben: 'SendPropertyChanging' и' SendPropertyChanged («Name») 'все еще необходимы в установщике, поскольку ORM замечает новые значения и, таким образом, выполняет обновление при отправке изменений. Учитывая, что проверка 'if (BackingField! = Value)', вероятно, также желательна. Так что, я могу удалить дополнительные крючки, но я все еще думаю, что он выглядит довольно громоздким. Тем не менее, это похоже на мой лучший вариант. Я, вероятно, соглашусь с этим, если не появится нечто более перспективное. –

1

Если у вас не будет успеха с классами partial (это, вероятно, лучший способ), вы можете просто сериализовать дату самостоятельно. Известно, что ASP.NET MVC использует JavaScriptSerializer для сериализации данных. JavaScriptSerializer имеют простые и приятные функции настройки, такие как JavaScriptConverter, и вы можете легко преобразовать объект в нечто менее стандартное (например, use Attr tags for json? или все другие темы).

Чтобы быть наиболее соответствовать стандартам, которые Вы можете определить класс, производный от JsonResult (например, как здесь ASP.net MVC returning JSONP или http://dev.qsh.eu/Blogs/Dmitry-P/January-2010/ASP-NET-MVC-Tip--3.aspx) и сохранить сериализованные данные в context.HttpContext.Response непосредственно с помощью метода Write. Тогда вы абсолютно свободны, как вы сериализуете данные в JSON.

0

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