Добавление сущностей Entity Framework (один-ко-многим) в JSON через ASP.NET WebMethod - PullRequest
4 голосов
/ 17 ноября 2009

В настоящее время я работаю над проектом, использующим как Entity Framework (версия, поставляемую с .NET Framework версии 3.5 с пакетом обновления 1), так и множество функциональных возможностей на основе AJAX, которые я реализую с помощью jQuery на стороне клиента и ASP. NET WebMethods на стороне сервера.

Обычно я создаю новые сущности, используя WebMethod, который принимает сущность в качестве параметра следующим образом:

 [WebMethod]
 public static void Add(User user);

При вызове этого метода я собираю объект, напоминающий сущность (с точки зрения свойств) в JavaScript, и передаю его в виде строки JSON. Однако при попытке передать связанные сущности в отношении «многие ко многим» я столкнулся с проблемой. Скажем, объект «Пользователь» имеет отношение «один ко многим» с объектом «Полет» - добавление нового пользователя с несколькими (новыми) рейсами оказывается проблематичным. Следующий подход:

 this.user.Flight = [];
 var x = new Object();
 // Code here to populate x's properties
 this.user.Flight.push(x);
 // Repeat again for more flights

В результате возникает ошибка ASP.NET (на этапе десериализации), в которой говорится, что List нельзя преобразовать в EntityCollection.

Затем я попробовал этот подход:

 this.user.Flight = {};
 var x = new Object();
 // Code here to populate x's properties
 this.user.Flight.firstFlight = x;
 // Repeat again for more flights

В этом случае WebMethod был успешно вызван, но полеты были потеряны полностью (вызов user.Flight.Count () в WebMethod вернул 0).

Кто-нибудь знает, как я могу передать несколько рейсов в EntityCollection в WebMethod?

Ответы [ 2 ]

2 голосов
/ 20 ноября 2009

У вас могут возникнуть трудности с использованием встроенных сериализаторов при попытке непосредственного использования ваших классов сущностей EF. Даже если бы вы смогли десериализовать из массива javascript в EntityCollection, вы не смогли бы пойти другим путем (граф объекта EF в js obj): вы получите известную ошибку «циклическая ссылка».

У меня много проектов, в которых я использую EF и веб-сервисы (но я еще не использовал динамические данные). Там могут быть другие хорошие варианты для вас попробовать. Вы можете создавать классы DTO или POD («Объект передачи данных» или «Простые старые данные»), которые представляют все свойства и отношения ваших классов сущностей (но не содержат методов или другого кода). Их можно легко сериализовать, десериализовать и передавать по проводам. Тем не менее, вы все равно можете столкнуться с ошибками циклической ссылки. Для них вы можете сделать свою собственную сериализацию, используя Json.NET , которая поддерживает циклические ссылки. Ваши сервисы должны быть модифицированы так, чтобы они возвращали строки, и вам пришлось бы вычислять строку json для литерала объекта на вашем вызывающем сайте javascript. Это не слишком много работы.

Возможно, вы можете использовать DataSvcUtil.exe для создания ваших классов DTO.

Несмотря на это, у меня есть проект, в котором я сейчас пытаюсь решить вашу проблему. Я получаю ту же ошибку, что вы заявили, и то же поведение, которое вы упомянули при переключении с [] на {} в JavaScript. Я буду продолжать пытаться, и дам вам знать, если я что-нибудь найду.

1 голос
/ 19 ноября 2009

Почему бы просто не вернуть список Flight s в качестве второго параметра, а затем добавить их к User в вашем методе?

Я не использую [WebMethod] с параметрами EF, и я обычно передаю структуры POD в качестве параметров, поэтому у меня никогда не было этой проблемы ....

...