ASP.NET MVC 5数据缓存 - 不按预期运行

Pau*_*ale 3 asp.net-mvc caching asp.net-mvc-5.2

我有一个我创建的视图模型,然后返回到我的视图.此视图模型未缓存.但是,视图模型包含缓存的类型"类别"列表.

我做通常的"如果在缓存中检索并返回.如果不在缓存中则检索数据,存储在缓存中并将视图模型返回到控制器.这按预期工作.

我的问题就在我将视图模型从我的控制器返回到我的视图之前我想更新我的类别列表中的记录,但仅针对调用它的页面(不是所有用户/页面调用它).当我这样做时,它会自动更新缓存中的类别列表,我不希望它.我只插入一次缓存,所以不明白为什么当我从缓存中检索它后更新列表时,更改会立即反映在缓存中.

这可能是我误解了OO/Cache是​​如何工作的,但我希望有人可以让我直截了当吗?

我控制器中的代码......

var vm = new FsmViewModel();
if(vm.ActiveCategoryId > 0)
vm.Categories.Find(c => c.Category_ID == vm.ActiveCategoryId).ActiveBootstrapCss = "active";
Run Code Online (Sandbox Code Playgroud)

上面的代码还更新了我在缓存中存储的类别列表?我正在使用代理模式从缓存或数据库填充类别列表.

ObjectCache cache = MemoryCache.Default;
_categories = (List<Category>)cache[CacheForCategories];

if (_categories != null) return _categories;

// Cache does not exist so create
var policy = new CacheItemPolicy {AbsoluteExpiration = DateTimeOffset.Now.AddHours(4)};

_categories = base.GetAllCategories();
cache.Add(CacheForCategories, _categories, policy);

return _categories;
Run Code Online (Sandbox Code Playgroud)

_categories返回到从缓存或db中提取的视图模型,并在我的视图模型对象中定义为

public List<Category> Categories { get; set; }
Run Code Online (Sandbox Code Playgroud)

有人可以让我知道我在这里做错了什么吗?

谢谢,

保罗

Mar*_*Ban 5

你没有做错任何事.这就是缓存无法正常工作的方式.它包含对象的引用,而不是对象的副本.因此,如果从缓存中加载一个对象,那么它基本上是同一个对象,因为您只会收到对它的引用.

在将对象保存到缓存中之前,可以对对象进行深层复制以避免此行为.