2016-12-29 7 views
0

Я переместился из Entity Framework 6 в EF Core, а также в среду Web Api .net для ядра .net.Ответ Json не содержит всех навигационных свойств EntityFramework Core и ASP .NETCore Web API

У меня есть отношения многие ко многим, что я настроил следующим

protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     var instrumentsToPlaces = modelBuilder.Entity<InstrumentPlace>(); 
     instrumentsToPlaces.ToTable("InstrumentsToPlaces"); 
     instrumentsToPlaces.HasKey(x => new { x.PlaceId, x.InstrumentId }); 

     instrumentsToPlaces.HasOne(i => i.Instrument) 
      .WithMany(p => p.InstrumentsPlaces) 
      .HasForeignKey(ip => ip.InstrumentId); 

     instrumentsToPlaces.HasOne(p => p.Place) 
      .WithMany(i => i.InstrumentsPlaces) 
      .HasForeignKey(ip => ip.PlaceId); 


     var instrumentsToStyle = modelBuilder.Entity<InstrumentStyle>(); 
     instrumentsToStyle.ToTable("InstrumentsToStyles"); 
     instrumentsToStyle.HasKey(x => new { x.StyleId, x.InstrumentId }); 

     instrumentsToStyle.HasOne(i => i.Instrument) 
      .WithMany(s => s.InstrumentStyles) 
      .HasForeignKey(si => si.InstrumentId); 

     instrumentsToStyle.HasOne(s => s.Style) 
      .WithMany(i => i.InstrumentStyles) 
      .HasForeignKey(si => si.StyleId); 

    } 

Я включил свойства навигации в методе репозитория следующим

 public Instrument GetInstrumentByName(string name) 
    { 
     using (var starsAndCatzDbContext = new StarsAndCatzDbContext()) 
     { 
      var instrument = _starsAndCatzDbContext.Instruments 
      .Include(a=>a.InstrumentsPlaces) 
      .ThenInclude(a=>a.Place) 
      .Include(a=>a.InstrumentStyles) 
      .ThenInclude(a=>a.Style) 
      .FirstOrDefault(i => i.Name == name); 


      return instrument; 

     } 


    } 

Здесь находятся классы

public class Instrument { 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<InstrumentPlace> InstrumentsPlaces { get; set; } 
    public virtual ICollection<InstrumentStyle> InstrumentStyles { get; set; } 
} 

public class InstrumentPlace 
{ 
    public int InstrumentId { get; set; } 
    public Instrument Instrument { get; set; } 
    public int PlaceId { get; set; } 
    public Place Place { get; set; } 
} 

    public class InstrumentStyle 
{ 
    public int InstrumentId { get; set; } 
    public Instrument Instrument { get; set; } 
    public int StyleId { get; set; } 
    public Style Style { get; set; } 
} 

    public class Style { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<InstrumentStyle> InstrumentStyles { get; set; } 
} 

     public class Place { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Division { get; set; } 
    public int Tier { get; set; } 
    public string State { get; set; } 
    public string Postcode { get; set; } 
    public float? Latitude { get; set; } 
    public float? Longitude { get; set; } 
    public virtual ICollection<InstrumentPlace> InstrumentsPlaces { get; set; } 
} 

Метод WebAPI, который будет называться:

 [HttpGet("GetInstrumentByName/{suburb}/{instrument}"), Produces("application/json")] 
    public Instrument GetInstrumentByName(string suburb, string instrument) 
    { 
     try 
     { 
      var result = _instrumentRepository.GetInstrumentByName(instrument); 
      return result; 
     } 
     catch (Exception ex) 
     { 

      _logger.LogError(ex.Message); 
      return new Instrument(); 
     } 

    } 

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

enter image description here

As вы заметите, что загружаются свойства навигации (когда я расширяю коллекции, я могу видеть все загружаемые свойства). Однако JSON ответ я получаю это следующий

enter image description here

Любые предложения или я что-то пропустил?

Благодарю вас всех в продвинутом состоянии

+0

Можете ли вы опубликовать определение класса Instrument, пожалуйста? –

+0

'public class Instrument { \t \t public int Id {get; задавать; } \t \t public string Имя {get; задавать; } \t \t Публичный список InstrumentsPlaces {get; задавать; } public List InstrumentStyles {get; задавать; } } '} } У меня были коллекции как виртуальные ICollection раньше .. но изменил его, чтобы увидеть, если это была проблема, но ничего не произошло – carlosJ

+1

У меня есть аналогичная функция, и я использую общедоступную виртуальную коллекцию OrderDetails {get; задавать; }, и я получаю объект с навигационным свойством, я думаю, вам нужно проверить настройки вашего сериализатора, вы проверили? –

ответ

1

Thanks @H. Герцль дал мне подсказку.

Решение было найдено в этом другом вопросе

services.AddMvc().AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); 

https://stackoverflow.com/a/40501464/1513346

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

  • Нет связанных вопросов^_^