Entity Framework 2.1, 2.2: загрузка связанных данных возвращает NULL или Incomplete
Буду очень признателен, если вы поможете мне в этом.
вот упрощенный образец:
Модель:Person
public int Id { get; set; }
public string Fname { get; set; }
public string Lname { get; set; }
public ICollection<TbContact> TbContact { get; set; }
Модель: Контакт
public int Id { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public int PersonId { get; set; }
public TbPerson Person { get; set; }
Контекст БД:
public virtual DbSet<Blog> Blog { get; set; }
public virtual DbSet<Post> Post { get; set; }
modelBuilder.Entity<TbContact>(entity =>
{
entity.Property(e => e.Email).HasMaxLength(50);
entity.Property(e => e.PersonId).HasColumnName("Person_Id");
entity.Property(e => e.Phone).HasMaxLength(50);
entity.HasOne(d => d.Person)
.WithMany(p => p.TbContact)
.HasForeignKey(d => d.PersonId)
.HasConstraintName("FK_TbContact_TbPerson");
});
modelBuilder.Entity<TbPerson>(entity =>
{
entity.Property(e => e.Fname).HasMaxLength(50);
entity.Property(e => e.Lname).HasMaxLength(50);
});
Все сгенерировано командой Scaffold-DbContext. Вот Api Controller:
private readonly ApiContext _context;
public PersonsController(ApiContext context)
{
_context = context;
}
// GET: api/TbPersons
[HttpGet]
public async Task<IActionResult> GetPerson()
{
var person = await _context.TbPerson.Include(x => x.TbContact).ToListAsync();
return Ok(person);
}
И возвращает NULL без ошибки компилятора, но если я удалю ".include", как показано ниже:
public async Task<IActionResult> GetPerson()
{
var person = await _context.TbPerson.ToListAsync();
return Ok(person);
}
Результат будет:
[{"id":1,"fname":"Josh","lname":"R","tbContact":[]}
Как я уже говорил, мне нужно получить "tbperson", включая "tbcontact".
1 ответ
Очевидно, это происходит из-за циклов самоссылки в JSON, поэтому мы можем отключить это с помощью кода ниже, и это решит проблему:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApiContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))
.UseLazyLoadingProxies());
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddJsonOptions(options => {
options.SerializerSettings.ReferenceLoopHandling=ReferenceLoopHandling.Ignore;
});
}