Entity Framework Core Ленивая загрузка с использованием прокси не работает (SQLite) - PullRequest
0 голосов
/ 31 марта 2019

При использовании отложенной загрузки я ожидаю, что дочерние навигационные свойства не загружены, но я не могу избежать загрузки дочерних элементов и появления круговой ссылки при сериализации как 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 Core:2.2.1
  • Поставщик базы данных: Microsoft.EntityFrameworkCore.Sqlite 2.2.1
  • Операционная система: Win 10
  • IDE: Visual Studio 2017

1 Ответ

1 голос
/ 01 апреля 2019

Из ef core docs :

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

...

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

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}
...