Получить MemoryCache в другом контроллере для базы данных Entity Framework - PullRequest
1 голос
/ 05 октября 2019

Я беру небольшие значения таблицы поиска из базы данных Entity Framework и сохраняю в MemoryCache. В настоящее время используются оба способа, обычный memoryCache и Singleton MemoryContainer, которые можно увидеть здесь Ядро Asp.Net: использовать кэш памяти вне контроллера .

In Домашний контроллер , это сохраняет ProductTypes вMemoryCache, и мы видим, что значения правильно хранятся в окне отладки (ProductType, ProductName и т. д.).

public class HomeController : Controller
{
    public IMemoryCache _memoryCache;
    public readonly StoreContext _storeContext;
    public MemoryContainer _memoryContainer;

    public HomeController(StoreContext storeContext, IMemoryCache memoryCache, MemoryContainer memoryContainer)
    {
        _storeContext= storeContext;
        _memoryCache = memoryCache;
        _memoryContainer = memoryContainer;
    }

    public IActionResult Index()
    {
        var productTypes = storeContext.ProductTypes;
        _memoryCache.Set("ProductTypesKey", productTypes );
        _memoryContainer._memoryCache.Set("ProductTypesKey2", test);
        return View();   //both values store correctly
    }

Затем при переходе к ProductController ,

public class ProductsController : Controller
{
    public StoreContext _storeContext;
    public IMemoryCache _memoryCache;
    public MemoryContainer _memoryContainer;

    public ProductsController(StoreContext storeContext, IMemoryCache memoryCache, MemoryContainer memoryContainer)
    {
        _storeContext = storeContext;
        _memoryCache = memoryCache;
        _memoryContainer = memoryContainer;
    }

    public async Task<IActionResult> Details(int? id)
    {
        var test =  _memoryCache.Get<DbSet<ProductTypes>>("ProductTypesKey");
        var test2 = _memoryContainer._memoryCache.Get<DbSet<ProductTypes>>("ProductTypesKey2");

Я вижу следующий результат ошибки в MemoryCache для обоих, как это можно исправить?

Как сделать так, чтобы MemoryCache правильно получал / сохранял с DbContext, независимо от перехода от Контроллера к Контроллеру?

"Невозможно получить доступ к удаленному объекту. Распространенной причиной этой ошибки является удаление контекста, который был разрешен путем внедрения зависимости, а затем попытка использовать тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы вызываете Dispose() для контекста или обертывание контекста в операторе using. Если вы используете зависимость, введитеИон, вы должны позволить контейнеру внедрения зависимости позаботиться об удалении экземпляров контекста. \ r \ nИмя объекта: 'StoreContext'. "

Другой код:

public class MemoryContainer
{
    public IMemoryCache _memoryCache { get; set; }
    public MemoryContainer(IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;
    }
}

Запуск. cs

services.AddMemoryCache();
services.AddSingleton<MemoryContainer>();

Другие ресурсы:

MVC Net Core Pass MemoryCache для всех контроллеров

1 Ответ

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

DbSet<T> реализует IQueryable, поэтому эти ProductTypes на самом деле не находятся внутри вашего приложения до материализации.

Простой ToList() выполнит свою работу:

var productTypes = storeContext.ProductTypes.ToList();

Затем,внутри другого контроллера:

var test =  _memoryCache.Get<List<ProductTypes>>("ProductTypesKey");

Вызов ToList() на DbSet без каких-либо фильтров не лучший подход во всех сценариях, поскольку он загружает всю таблицу sql за DbSet. Тем не менее, я думаю, это то, что вы пытаетесь сделать, просто убедитесь, что вы никогда не делаете это на таблице с большим количеством данных.

Примечание: вы видитеданные в окне отладки, поскольку расширение результатов IQueryable фактически выполняет запросы sql.

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