Цикл свойств навигации EF Core

Рассмотрим следующие

Модели:

public class Blog
{
    public Guid ID {get; set;}
    public string Name {get; set;}
    // more fields...

    // Navigation Property
    public IList<Post> Posts {get; set;}
}

public class Posts
{
    public Guid ID {get; set;}
    public Guid BlogID {get; set;}
    public string Author {get; set;}
    // more fields...

    // Navigation Property
    public Blog Blog {get; set;}
}

В DbContext.OnModelCreating:

// Primary Keys
modelBuilder.Entity<Blog>()
            .HasKey(c => c.ID);

modelBuilder.Entity<Post>()
            .HasKey(c => c.ID);

modelBuilder.Entity<Blog>()
            .HasMany(c => c.Posts)
            .WithOne(c => c.Blog)
            .HasForeignKey(c => c.BlogID)
            .HasPrincipalKey(c => c.ID);

modelBuilder.Entity<Post>()
            .WithOne(c => c.Blog)
            .HasMany(c => c.Posts)     
            .HasForeignKey(c => c.BlogID)
            .HasPrincipalKey(c => c.ID);

Все это работает, проблема в том, что я получаю блог, он содержит сообщение, которое содержит блог, который содержит список сообщений , каждый из которых содержит блог и т. д.

введите здесь описание изображения

Как я могу ограничить это определенным уровнем вложенности? Я проверил docs и не смог найти решения.


person JaggerJo    schedule 30.04.2018    source источник
comment
почему это проблема? EF выполняет ленивую загрузку, поэтому, когда вы щелкаете или получаете следующее свойство, он перемещается в базу данных и получает его для вас.   -  person madoxdev    schedule 30.04.2018
comment
Ленивой загрузки пока нет. Но свойства навигации просто связаны друг с другом. Таким образом, 1_. Это не вложение, свойства указывают на один и тот же объект.   -  person Ivan Stoev    schedule 30.04.2018


Ответы (1)


Я не думаю, что это вообще можно ограничить. Но также я не думаю, что это может вызвать какие-либо проблемы.

EntityFramework имеет дело с navigation properties, заменяя (переопределяя) их функциональность фактическим запросом к базе данных. Этот подход называется LazyLoading.

Это означает, что каждый раз, когда вы обращаетесь к свойству, он просто обращается к базе данных и приносит вам данные, и он может делать это вечно, когда вы запрашиваете.

Надеюсь, это объясняет?

Дополнительное объяснение можно найти здесь.

С Уважением

person madoxdev    schedule 30.04.2018
comment
Есть ли способ создать отношение с помощью свободного API без свойств навигации? - person JaggerJo; 30.04.2018
comment
в первую очередь, почему вы думаете, что это проблема? Я не думаю, что вы можете делать ответы без свойств навигации. Вы можете превратить это в EagerLoading вместо LazyLoading, тогда у него будут данные, которые вы включаете, и ничего более. - person madoxdev; 30.04.2018
comment
проблема возникает при сопоставлении модели базы данных с моделью Api. (Исключение Stackoverflow). Я мог бы просто установить для свойства навигации значение null, но подумал, что это может быть более элегантное решение. - person JaggerJo; 30.04.2018
comment
да, это не вариант, я согласен. Что вы используете для составления карт? - person madoxdev; 30.04.2018
comment
Я использую AutoMapper. Проблема только при создании / обновлении. Когда я вручную получаю его из базы данных, я могу указать, что должно быть включено, с помощью .Include. - person JaggerJo; 30.04.2018
comment
Я почти уверен, что вы можете установить это в Automapper. Хотя не могу вспомнить с макушки. - person madoxdev; 30.04.2018
comment
Это неправильный ответ. Нет ленивой загрузки. Свойства навигации не виртуальны. Независимо от того, каким образом вы заполняете элементы навигации, EF исправляет ошибки, поэтому обе стороны навигации будут указывать друг на друга. Это типичная проблема сериализации, с которой вам нужно справиться. - person Smit; 02.05.2018