2016-02-16 3 views
0

У меня есть контроллер WebAPI, который должен вернуть коллекцию из базы данных, но мне также необходимо удалить некоторые свойства из некоторых объектов. Однако по какой-либо причине свойства, представляющие другой объект, возвращают значение null, за исключением , иногда, когда я перешагиваю код в режиме отладки. Я показал ответ JSon ниже, который показывает Спорт, HomeTeam и AwayTeam в нуль:EF иногда возвращает null для типов внешних ключей

enter image description here

Но когда я перешагнуть кода в режиме отладки я получаю ожидаемый результат:

enter image description here

Соответствующий метод контроллера следующим образом

public dynamic Get() 
{ 
    var allPicks = _db.Picks; 
    if (User.Identity.IsAuthenticated) 
    { 
     string userId = User.Identity.GetUserId(); 
     var picks = _db.UnlockedPicks 
      .Include(p => p.SelectedPick.AwayTeam) 
      .Include(p => p.SelectedPick.HomeTeam) 
      .Include(p => p.SelectedPick.Sport) 
      .Where(p => p.UserId == userId); 

     var unlockedPicks = picks.Select(p => p.SelectedPick); 
     var otherPicks = allPicks.Except(unlockedPicks).Select(p => new 
     { 
      Analysis = "", 
      PickSummary = "", 
      Title = p.Title, 
      Id = p.Id, 
      Sport = p.Sport, 
      HomeTeam = p.HomeTeam, 
      AwayTeam = p.AwayTeam, 
      MatchTime = p.MatchTime, 
      PublishTime = p.PublishTime 
     }); 
     return new 
     { 
      UnlockedPicks = unlockedPicks.OrderByDescending(p => p.MatchTime), 
      OtherPicks = otherPicks.OrderByDescending(p => p.MatchTime) 
     }; 
    } 
    var publicPicks = allPicks.OrderByDescending(p => p.MatchTime).Select(p => new 
    { 
     Analysis = "", 
     PickSummary = "", 
     Title = p.Title, 
     Id = p.Id, 
     Sport = p.Sport, 
     HomeTeam = p.HomeTeam, 
     AwayTeam = p.AwayTeam, 
     MatchTime = p.MatchTime, 
     PublishTime = p.PublishTime 
    }); 
    return new { UnlockedPicks = new Pick[0], OtherPicks = publicPicks }; 
} 

Без Include() он возвращал null каждый раз, но как я могу заставить его возвращать ожидаемый результат каждый раз?

ответ

0

Это случается, потому что вы не используете ленивую загрузку. Когда ленивая загрузка дезактивирована, вам необходимо позвонить Include, чтобы загрузить свойства навигации. Если вы хотите загрузить все свойства навигации, не вызывая Include, вам придется активировать ленивую загрузку, которая может быть выполнена через конструктор контекста. Например:

public partial class SchoolDBEntities : DbContext 
{ 
    public SchoolDBEntities(): base("name=SchoolDBEntities") 
    { 
     this.Configuration.LazyLoadingEnabled = true; 
    } 
} 

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

+0

Я попытался это, но тогда я получаю 'Ошибка получения значения из«AwayTeam»на«System.Data.Entity.DynamicProxies.Pick_300C9B9073E6C214AE564BA2A5A64098700CFA4A782832A5CEC6BD386AB3AA63'.' – mhcodner

+0

Этот класс имеет некоторые свойства, которые не могут быть преобразованы в формат JSON. Вы никогда не должны возвращать весь объект. Вместо этого вы должны создать экземпляр модели представления своего объекта, а затем сериализовать его в json. Взгляните на эту ссылку http://stackoverflow.com/questions/18668617/json-net-error-getting-value-from-scopeid-on-system-net-ipaddress –

+0

Я закончил работу над этим, просто сохранив Идентификатор разблокированных выборов и использование этого, чтобы вернуть список выбранных – mhcodner

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