#.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. спасибо, но как мы могли бы сказать, что отложенная загрузка тогда работает?