Entity Framework не видит данные в базе данных, пока DBSet не преобразуется в список - PullRequest
0 голосов
/ 20 октября 2019

Я определяю индексный API контроллера следующим образом:

[HttpGet]
public IEnumerable<Blog> GetDatas()
{
    return _context.Blogs;
}

Это всегда возвращает пустое значение, даже если база данных содержит много blog с. Тем не менее, когда я делаю следующее только для проверки , платформа управления данными видит данные и может возвращать все blog в базе данных:

[HttpGet]
public IEnumerable<Blog> GetDatas()
{
    var blogs = _context.blogs.ToList();
    return _context.Blogs;
}

Есть мысли?

(может быть связано с моим другим неотвеченным вопросом ).

Обновление 1

Во избежание путаницы в отношении отложенного выполнения в LINQ;Я попробовал следующие два метода, и не используя ни один из методов, возвращаемый объект json не содержит информацию, уже находящуюся в базе данных. Другими словами, сериализованные объекты не отражают сущности, сохраненные в базе данных. Я думаю, что эти методы будут запускать выполнение запроса LINQ, правильно?

// Method 1:
[HttpGet]
public async Task<ActionResult<IEnumerable<Blog>>> GetDatas()
{
    return await _context.Blogs.ToListAsync().ConfigureAwait(false);
}

// Method 2:
[HttpGet]
public IEnumerable<Blog> GetDatas()
{
    return _context.Blogs.ToList();
}

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Как сказал Даниил, это сделано намеренно. См. Каковы преимущества отложенного выполнения в LINQ? для расширенного обсуждения, но по существу данные загружаются при его использовании, а не при его запросе. Единственный способ увидеть, что он пуст, - это отладчик;ваш исполняемый код не видит его таким образом, потому что как только вы попытаетесь выяснить, пуста ли первая форма или нет, она заполнится данными, и в этот момент (точка использования) не имеет значения, что она былапусто до этого момента - ничто не использовало его, чтобы выяснить, было ли оно пустым или полным

Думайте об этом немного как кошка Шрондингера

Это довольно полезно на самом деле:

var w = worldPopulation.Where(e => e.Gender = Gender.Male)

if(name!=null)
  w=w.Where(e=>e.Name == name)

Первый запрос, если он был выполнен немедленно, мог видеть 3,5 миллиарда результатов, загруженных из вашей базы данных на ваш клиент (машина с низкой спецификацией по сравнению с сервером), тогда фильтр имен уменьшил бы его до нескольких миллионов. Во-первых, лучше всего загрузить несколько миллионов в вашу медленную машину с низкой спецификацией по очень медленной сети .. верно?

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

0 голосов
/ 28 октября 2019

Используйте пул областей или контекста для базы данных вместо одноэлементного или временного;то есть используйте:

services.AddDbContextPool<BlogsContext>(options => {options.UseSqlServer();});

и избегайте таких регистраций, как (примечание ServiceLifetime.Singleton):

services.AddDbContext<BlogsContext>(options => {options.UseSqlServer();}, ServiceLifetime.Singleton);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...