Я переместился из 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();
}
}
Когда я отправить запрос на «/ апи/инструменты/запад-конец/гитара» Я получаю ожидаемый результат, когда я устанавливаю точку останова перед отправкой ответа следующим
As вы заметите, что загружаются свойства навигации (когда я расширяю коллекции, я могу видеть все загружаемые свойства). Однако JSON ответ я получаю это следующий
Любые предложения или я что-то пропустил?
Благодарю вас всех в продвинутом состоянии
Можете ли вы опубликовать определение класса Instrument, пожалуйста? –
'public class Instrument { \t \t public int Id {get; задавать; } \t \t public string Имя {get; задавать; } \t \t Публичный список InstrumentsPlaces {get; задавать; } public List InstrumentStyles {get; задавать; } } '} } У меня были коллекции как виртуальные ICollection раньше .. но изменил его, чтобы увидеть, если это была проблема, но ничего не произошло –
carlosJ
У меня есть аналогичная функция, и я использую общедоступную виртуальную коллекцию OrderDetails {get; задавать; }, и я получаю объект с навигационным свойством, я думаю, вам нужно проверить настройки вашего сериализатора, вы проверили? –