2015-04-03 3 views
0

Я создаю приложение N-уровня, которое должно отправлять данные JSON, которые считываются с SQL Server 2012 через Enity Framework.Ошибка при запросе данных через Entity Framework

Когда я пытаюсь запросить коллекцию пользователей, я получаю сообщение «Ошибка произошла». Он работает с жестко закодированными данными.

Это мой код:

public IEnumerable<User> Get() 
{ 
    IUserManager userManager = new UserManager(); 
    return userManager.GetUsers(); 
} 


public IEnumerable<User> GetUsers() 
{ 
    return repo.ReadUsers(); 
} 

public IEnumerable<User> ReadUsers() 
{ 
    IEnumerable<User> users = ctx.Users.ToList(); 
    return users; 
} 

"CTX" является ссылкой на DbContext-объекта.

EDIT: Это работает:

public IEnumerable<User> Get() 
{ 
    IList<User> users = new List<User>(); 
    users.Add(new User() { FirstName = "TestPerson1" }); 
    users.Add(new User() { FirstName = "TestPerson2" }); 

    return users; 
} 

скриншот браузера: http://i.imgur.com/zqG0qe0.png

EDIT: Полная ошибка (скриншот): http://i.imgur.com/dt48tRG.png

Спасибо заранее.

+2

Можете ли вы разместить дополнительную информацию об ошибке? Скриншот в браузере? Внутреннее исключение? Трассировки стека? –

+0

Дайте нам исключение, которое встречается в 'ctx.Users.ToList();'. Вы моментальный снимок не помогает вообще. – Artiom

+0

Это не дает исключения, просто показывает эту страницу. – Sn0wBlind

ответ

2

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

  • Отладить веб-сайт: запустите сайт локально или приложите свой отладчик к локально работающему веб-сайту. При переходе через код отладчик остановится, когда он попадет в исключение, и вы увидите подробности об исключении.
  • Отключить пользовательские ошибки: IIS хочет защитить вашу внутреннюю работу, поэтому стандартное поведение не должно показывать полные исключения. Чтобы отключить это поведение изменить web.config и добавить узел XML под

После получения фактического исключения пожалуйста, обновите ваш вопрос стек вызовов & реальная внутренняя ошибка сервера. Я предполагаю, что у вас есть проблема с сериализацией, возможно, круговая ссылка. Вы исправите это, чтобы либо сделать simpel viewModel (и не возвращать объект напрямую), либо добавить параметры сериализации (например, поддержка круговых ссылок json.net).

Редактировать
Как и предполагалось, сериализация дает вам трудное время. Причиной является создание прокси, используемое ленивой загрузкой. Вы можете отключить создание прокси с помощью следующего кода (обратите внимание, что это также отключает ленивую загрузку).

public IEnumerable<User> ReadUsers() 
{ 
    ctx.Configuration.ProxyCreationEnabled = false; 
    IEnumerable<User> users = ctx.Users.ToList(); 
    return users; 
} 

Если это работает, вы можете рассмотреть возможность отключения создания прокси во время инициализации контекста.

+0

Наконец выяснили, как отобразить полную ошибку. http://i.imgur.com/dt48tRG.png – Sn0wBlind

+0

@ Возврат только простой модели клиенту – Artiom

+1

Я согласен с Artiom, что отображение ваших объектов было бы хорошей идеей. Но так как я не хочу навязывать свой стиль кодирования, и кажется, что вы не хотите отображать карту (так как вы не принимали его ответ), я предоставил другую работу в моем ответе. – Kristof

0

Поскольку он работает с жестко закодированными данными, есть возможность включения lazyloading в контексте.

Если так отключить ленивую загрузку в контексте или вот так, чтобы сериализация в JSON не загружала сущности из базы данных.

public IEnumerable<User> ReadUsers() 
{ 
    ctx.Configuration.LazyLoadingEnabled = false; 
    IEnumerable<User> users = ctx.Users.ToList(); 
    return users; 
} 
+0

Не исправить проблему, спасибо за ответ, хотя – Sn0wBlind

1

Попытка вернуть простую модель, как-л

var logins = ctx.Users.Select(user => new FlatUserModel 
            { 
             Id = user.Id, 
             Name = user.UserName, 
             Email = user.Email 
            }) 
            .ToArray(); 
return logins; 

Также смотрите в браузере, что вы получите в ответ.

+0

UPDATE: работает в Internet Explorer. Забыл сообщить, что Chrome запрашивает XML по умолчанию. – Sn0wBlind

+0

@ Sn0wBlind не помогло? в соответствии с вашим исключением - свойства навигации вызывают это исключение – Artiom

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