Как запретить Entity Framework включать свойства, которые я не хочу? - PullRequest
0 голосов
/ 13 июня 2019

При чтении типа сущности из моего DataContext я получаю все связанные объекты, когда они мне не нужны.Как настроить EF так, чтобы я выполнял только явную загрузку?

Чтение информации msdn, например, здесь: https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-2-2/

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

public class TalesContext : DbContext
{
    public TalesContext()
    {
    }

    public TalesContext(DbContextOptions<TalesContext> options) : base(options)
    {
    }

    protected internal DbSet<Story> Stories { get; set; }
    protected internal DbSet<Event> Events { get; set; }
    protected internal DbSet<StoryEventMention> EventMentions { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (optionsBuilder.IsConfigured) return;

        optionsBuilder.UseInMemoryDatabase("TalesTesting");
    }
}

public class Event
{
    [Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public IList<StoryEventMention> EventMentions { get; set; }
    [MaxLength(128)]
    public string Title { get; set; }
}


var query = from e in TalesContext.Events select e;
// various query.Where
query = query.Skip((pageNumber - 1) * pageSize).Take(pageSize);
return query.ToList();

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

Я получаю это, когда запускаю модульный тест и выставляю его через API.

Ответы [ 3 ]

1 голос
/ 21 июня 2019

Я нашел свою ошибку.

Мой класс EventFetcher является одноэлементным, зарегистрированным через IoC. Он имеет ссылку на TalesContext, также зарегистрированный как синглтон через IoC. Так что у меня был один DataContext через приложение. Поэтому, когда поступил первый запрос, он заполнил базу данных - и в нем было все. Таким образом, все ссылки между объектами уже созданы, и когда я запросил один объект без явного его включения, контекст вернул данные, которые он уже имел со всем прикрепленным.

Я сделал реструктуризацию для того, чтобы новый контекст вводился в контроллер при каждом запросе, и поведение точно соответствует ожидаемому. Итак, урок здесь - помнить о возрасте и постоянстве контекста данных, если вы начинаете получать неожиданные результаты при запросах.

Спасибо за помощь!

0 голосов
/ 15 июня 2019

Примечание. Я не могу комментировать и не хочу, чтобы это было ответом.

Вам необходимо создать экземпляр.Это не статическое свойство, это свойство экземпляра.

0 голосов
/ 13 июня 2019

Чтобы ответить на ваш вопрос.Я полагаю, что вам нужно сделать, внутри вашего TalesContext позвоните так:

this.Configuration.LazyLoadingEnabled = false;

Источники: объясняет ленивую загрузку: https://www.entityframeworktutorial.net/lazyloading-in-entity-framework.aspx

Объясняет разницу между энергичной загрузкой и ленивой загрузкой https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

...