Не работает отложенная загрузка ядра Entity Framework с использованием прокси (SQLite)

#.net-core #entity-framework-core

#.net-ядро #entity-framework-core

Вопрос:

При использовании отложенной загрузки я ожидаю, что дочерние свойства навигации не будут загружены, но я не могу избежать загрузки дочерних элементов, которые вызывают циклическую ссылку при сериализации в формате json

DbContext :

 public class SampleDbContext : DbContext
{
    public SampleDbContext(DbContextOptions<SampleDbContext> options: base(options)
    { }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLazyLoadingProxies();
    }

    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }
}
  

Классы модели:

 public class Child
{
    public int Id { get; set; }
    [ForeignKey("Parent")]
    public int ParentId { get; set; }
    public string Name { get; set; }
    public virtual Parent parent { get; set; }
}

public class Parent
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Child> children { get; set; }
}
  

Запуск:

 services.AddDbContext<Models.SampleDbContext>(options =>options.UseLazyLoadingProxies().UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
  

Контроллер:

 [HttpGet]
public async Task<List<Models.Parent>> Get()
{
    var sample = _cont.Parents.ToList();
    return sample;
}
  

Использование:

  • Версия ядра EF: 2.2.1
  • Поставщик базы данных: Microsoft.EntityFrameworkCore.Sqlite 2.2.1
  • Операционная система: Win 10
  • IDE: Visual Studio 2017

Ответ №1:

Из ef core docs:

Поскольку EF Core автоматически исправит свойства навигации, в вашем графе объектов могут возникнуть циклы.

Если вы используете ASP.NET Ядро, вы можете настроить Json.СЕТЬ игнорирует циклы, которые она находит в графе объектов.

 public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}
  

Комментарии:

1. спасибо, но как мы могли бы сказать, что отложенная загрузка тогда работает?