4

У меня есть две таблицы: Users & Profiles. Пользователь имеет один профиль (1: 1), профиль может быть затронут многими пользователями, каждый профиль имеет много модулей, каждый модуль имеет множество действий.Структура сущности - Избегайте круговой связи в сериализации

Я отправляю этот объект из asmx на страницу aspx, используя прямой служебный вызов.

У меня возникла ошибка из-за ленивой загрузки ... поэтому я отключил ленивую загрузку.

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

Чтобы построить дерево меню, мне нужно получить профиль. Я включил его:

 User user = new User(); 
     using (cduContext db = new cduContext()) 
     { 
      // get the user 
      string encryptedPassword = Encryption.Encrypt(password); 
      user = (from u in db.Users 
        where u.UserName.Equals(login) && 
          u.Password.Equals(encryptedPassword) 
        select u).FirstOrDefault(); 
      // Include the users profile 
      user = db.Users.Include("Profile").FirstOrDefault(); 
     } 
     return user; 

Я получил эту ошибку в функции яваскрипта вызова:

Круговая ссылка была обнаружена при сериализации объекта типа «CDU.Entities.Models.User».

Когда я сделал быстрый часы на пользовательском объекте, в ASMX (перед отправкой), я обнаружил, что профиль включен в список пользователей, которые имели этот pofile, каждый пользователь имеет свой профиль загружается ... и т.д.

Любая идея, пожалуйста?

+0

Что вы используете для сериализации Json? JSON.NET? –

+0

Почему вы выполняете запрос, а затем перезаписываете его другим запросом, не делая ничего с первым запросом? –

ответ

3

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

using (cduContext db = new cduContext()) 
{ 
    // get the user 
    string encryptedPassword = Encryption.Encrypt(password); 
    var user = from u in db.Users 
       where u.UserName.Equals(login) && 
        u.Password.Equals(encryptedPassword) 
       select u; 
    // Include the users profile 
    return user.Include("Profile").FirstOrDefault(); 
} 

В вашем коде, вы выбрасывали первый запрос, переписав его со вторым. И нет оснований для создания пустого пользователя.

Чтобы решить вашу проблему, вы должны принять решение о том, что вы не хотите сериализовать. В вашем случае вы, вероятно, не хотите сериализовать Profile.Users

Вы не упомянули, какой сериализатор вы используете. Я предполагаю, что вы используете сериализатор DataContract?

EDIT:

Вы бы отметить Ваш Profile.Users объект с [IgnoreDataMember] Attribute.

+0

Здравствуйте, Да, его сериализатор DataContract, Я хочу добавить «вспомогательные объекты» по запросу: Здесь я должен взять объект пользователя, его профиль, но НЕТ ПОЛЬЗОВАТЕЛЕЙ в профиле. – albarmat

+0

@AliBARMAT - см. Обновление –

+0

спасибо! вот оно! – albarmat

Смежные вопросы