Создание пользовательского свойства в Entity Framework

У меня есть база данных, из которой я хочу создать объект, а затем сгенерировать вывод RESTful.

Моя цель — добавить свойство в одну из таблиц, как только она станет сущностью. Данные для этого свойства были бы получены путем вычислений, выполненных в нескольких разных полях таблицы. Оттуда генератор кода будет создавать вывод RESTful, как обычно.

Мне удалось обновить разделы SSDL, CSDL и сопоставления файла edmx, а также использовать SampleEdmxCodeGenerator в качестве специального инструмента. Когда у меня есть все разделы в файле edmx, заполненные моим пользовательским свойством, svc терпит неудачу, потому что (я предполагаю), что свойство не существует в базе данных. Если я оставлю свойство вне SSDL, но помещу его в клиентскую схему (CSDL) и раздел сопоставления, я не смогу построить свой проект.

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

Я иду в правильном направлении, или это невозможно? Кажется, что я должен быть в состоянии сделать это с минимальными усилиями, но я продолжаю биться о стены.


person georryan    schedule 24.09.2009    source источник


Ответы (2)


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

  1. Создайте файл частичного класса рядом с моделью .edmx, которая имеет то же имя, что и ваша сущность.
  2. В нем укажите свойство, которое вы хотите, как свойство только для чтения, которое выполняет вычисления для каждого get.
person Tomas Aschan    schedule 25.09.2009
comment
да, частичный класс - это то, что нужно... Это свойство не имеет ничего общего с моделью EDMX, если оно не будет храниться в БД. - person Thomas Levesque; 25.09.2009
comment
Как сделать, чтобы свойство отображалось в выходных данных SVC, если выходные данные SVC основаны на модели объекта EDMX? - person georryan; 25.09.2009
comment
В частности, как получить свойство только для чтения, которое будет отображаться в выходных данных SVC (это не повлияет на базу данных), если SVC основан на модели EDMX. Это приложение не будет сохранять обратно в базу данных, поэтому я просто хочу иметь данные для чтения. Я хотел бы, чтобы дополнительное свойство, которого нет в базе данных, также отображалось в выходных данных. Я думаю, что я могу получить частичные классы, чтобы дать мне данные, которые мне нужны. Как передать это в SVC? - person georryan; 25.09.2009
comment
Извините за невежество, но я не знаю, о чем вы говорите... Что такое SVC (может быть, мне достаточно расшифровать акроним, чтобы понять его ;)), и как вы получаете остальную часть его вывода ? (И из чего состоит вывод?) - person Tomas Aschan; 25.09.2009
comment
Я создаю службу данных ADO.Net (имя файла.svc). Вот где появляется svc, это расширение файла службы данных. Я говорю ему просмотреть один из моих объектов, и он автоматически создает вывод на основе этого объекта. Это в форме веб-служб RESTful, и я могу просматривать данные, которые служба предоставляет мне через URL-адреса, если у меня есть разрешение на их просмотр. Похоже, частичные классы могут дать мне данные, но теперь я пытаюсь получить результат так, как хочу. Прямо сейчас он показывает только мои поля сущностей, и я хотел бы добавить еще одно. - person georryan; 25.09.2009

Частичные классы и частичные методы были первой частью моего ответа. То, что я по существу пытаюсь сделать, я не могу сделать. Я могу манипулировать возвращаемыми данными с помощью разделяемых методов и разделяемых классов. Я могу подключить метод OnmethodnameChanged(), чтобы отформатировать данные так, как я хочу, чтобы они отображались, но это лишь часть пути к желаемому результату.

Что я также хотел бы сделать, так это создать свойство c, которое не существует в виде столбца в базе данных (и, следовательно, не существует в моем объекте), рассчитанное на основе пары различных свойств в базе данных (скажем, a и b ), а затем добавьте свойство c в класс инфраструктуры сущностей. При этом я полагал, что затем он будет сгенерирован в вывод веб-службы RESTful.

Возникающая проблема связана с необходимостью того, чтобы класс обновлял любые сделанные вами изменения и распространял их обратно в источник данных. Меня это не заботило, потому что я хочу, чтобы моя собственность была доступна только для чтения. Из того, что я собрал, это невозможно.

Для справки, эти два сообщения действительно помогли: Добавление пользовательского свойства в класс Entity Framework (сейчас я могу опубликовать только один URL, так что вот адрес другой статьи)

social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/b7a9e01d-c5c2-4478-8f01-00f7f6e0f75f

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

mstecharchitect.blogspot.com/2008/12/surfacing-custom-data-source-in-adonet.html

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

Надеюсь, это поможет кому-то еще с той же проблемой. Похоже, это недостаток текущей версии Data Services, но я уверен, что в более поздних версиях его исправят. Возможно, T4 и .net 4.0 решат эту проблему. Я не уверен.

person georryan    schedule 26.09.2009
comment
В итоге я использовал решение LINQ to SQL для получения своих данных, а затем взял данные, манипулировал ими так, как хотел, а затем поместил их в объект List, состоящий из моего собственного класса. Этот список был iQueryable, и я использовал его в качестве источника данных для своего вывода RESTful. Работает как часы. - person georryan; 28.09.2009