Ссылочный цикл EF Core при использовании Include и ThenInclude - PullRequest
0 голосов
/ 29 января 2019

В моем приложении пользователи могут делать запросы на дополнительную информацию.Затем мне нужно иметь возможность получить эту информацию, но мне также нужно увидеть, какие заказы уже сделал пользователь, который сделал запрос.

Я настроил следующее с помощью EF Core:

Модели:

public class InfoRequest
{
    public int InfoRequestId { get; set; }
    public int UserId { get; set; }
    public User User { get; set }
}

public class User
{
    public int UserId { get; set; }
    public ICollection<Booking> { get; set; }
}

public class Booking
{
    public int BookingId { get; set; }
    public int UserId { get; set; }
    public User User { get; set }
}

Контекст:

modelBuilder.Entity<InfoRequest>(builder =>
{
    builder.ToTable("inforequests");
    builder.HasKey(x => x.InfoRequestId);
});

modelBuilder.Entity<User>(builder =>
{
    builder.ToTable("userdetails");
    builder.HasKey(x => x.UserId);

    builder
        .HasMany(x => x.Bookings)
        .WithOne(x => x.User)
        .HasForeignKey(x => x.UserId);
});

modelBuilder.Entity<Booking>(builder =>
{
    builder.ToTable("bookings");
    builder.HasKey(x => x.BookingId);
});

Я использую следующий код для извлечения необходимых мне данных:

public IQueryable<InfoRequest> GetAllInfoRequestsWithChildren()
    => this.Context.Set<InfoRequest>().AsNoTracking()
        .Include(x => x.User)
            .ThenInclude(x => x.Bookings);

Досадно, это дает мне следующую самосвязанную структуру данных, которая, очевидно, очень медленная:

InfoRequest
    -> User
        -> Booking
            -> User
                -> Booking
                    -> User
                        -> Booking
                            -> etc...

Как я могу предотвратить это, не втягивая все это впамять с ToList(), а затем удаление петли вручную?Я просто хочу, чтобы EF вообще не создавал цикл.

Мне нужно следующее:

InfoRequest
    -> User
        -> Booking

1 Ответ

0 голосов
/ 29 января 2019

Вы не можете остановить создание прокси при использовании Стремительная загрузка в EF / EF Core .Это поведение по умолчанию EF / EF core , и изменить его невозможно.

Но может быть (я не пробовал) вы можете остановить создание прокси для Ленивая загрузка в EF Core> = 2,1 , как указано в Документация EF Core .

Но вы можете остановить Self referencing loop из-за прокси во время преобразованияJSON следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    ...

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

    ...
}

Для более подробной информации: Связанные данные и сериализация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...