Кэш-память. Net Core не сохраняются значения - PullRequest
0 голосов
/ 02 января 2019

У меня есть приложение .NET Core 2.1.В Startup.cs методе конфигурации я использую:

services.AddDbContext<ApplicationDbContext>(options =
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
...

services.AddMemoryCache();   

Затем в моем контроллере:

public class DropDownListController : Controller
{
    private readonly ApplicationDbContext _context;
    private readonly IMemoryCache _memoryCache;

    private const string ProvidersCacheKey = "providers";
    private const string AgenciesCacheKey = "agencies";

    public DropDownListController(ApplicationDbContext context, IMemoryCache memoryCache )
    {
        _context = context;
        _memoryCache = memoryCache;
    }
}

и в контроллере также метод для получения выпадающего списка:

public JsonResult GetProvider()
{
    IEnumerable<DropDownListCode.NameValueStr> providerlist;

    if (_memoryCache.TryGetValue(ProvidersCacheKey, out providerlist))
    {
        return Json(providerlist);
    }
    else
    {
        MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions();
        cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddDays(30);
        cacheExpirationOptions.Priority = CacheItemPriority.Normal;

        DropDownListCode um = new DropDownListCode(_context);
        var result = um.GetProviderList();

        _memoryCache.Set(ProvidersCacheKey, result);

        return Json(result);
    }
}

Когда я устанавливаю точку останова на линии:

return Json(providerlist);

Я вижу, что ProvidersCacheKey находится в _memoryCache, но не имеет значения.

Что случилось с данными?

Когда я делаю Quick Watch на _memoryCache, я вижу, что объект DbContext был уничтожен.Но как это может быть, код работает нормально, но объект кэша не содержит данных, которые я сохранил в нем.

Любая помощь будет принята.

1 Ответ

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

Способ получения провайдеров:

public IEnumerable<NameValueStr> GetProviderList()
    {
        var providerlist = (from a in _context.AgencyProvider
                            where a.Provider == a.AgencyId
                            select new NameValueStr
                            {
                                id = a.Provider,
                                name = a.Name
                            });

        return providerlist.Distinct();
    }

Добавление "ToList ()" в вызывающий метод сработало:

MemoryCacheEntryOptions cacheExpirationOptions = new MemoryCacheEntryOptions();
            cacheExpirationOptions.AbsoluteExpiration = DateTime.Now.AddMinutes(30);
            cacheExpirationOptions.Priority = CacheItemPriority.Normal;
            DropDownListCode um = new DropDownListCode(_context);
            var result = um.GetProviderList().ToList();
            _memoryCache.Set(ProvidersCacheKey, result);
            return Json(result);

Вся заслуга Стиву Пи ... Спасибо, сэр!

...