使用 ASP.NET 水平缩放的实体框架缓存

问题描述 投票:0回答:1

关于水平扩展 ASP.NET 和 EF Core 的问题。我的理解是每个EF核心应用程序都维护自己的缓存。 因此,如果我的应用程序中有一个 EF 实体,并且我想要有多个 ASP.NET 应用程序实例,是否有一种通用方法可以确保 EF 缓存(针对此单个实体)可以在应用程序实例之间保持同步?

我看到有 https://github.com/VahidN/EFCoreSecondLevelCacheInterceptor 上面说这个项目可以使用Redis,作为分布式缓存。

该项目提到其建议的用例是“全局站点设置和公共数据,例如不经常更改的文章或评论”。 我的用例是使用 CRUD 频繁更改数据实体。

entity-framework asp.net-core caching entity-framework-core horizontal-scaling
1个回答
0
投票

实体框架在

DbContext
中保存其内部状态。该状态不用作缓存。它只是检测
DbContext
的创建和
SaveChanges
的执行之间是否发生了更改,没有同步。 DbContext 将计算要发送的查询并在 SQL 事务期间发送它。事务保证数据的一致性。如果事务失败,则意味着其他事务更改了当前事务访问的数据,因此无法保证数据正确性,数据库中不会发生任何更改,并且
DbContext
不会更新。这种方法非常适合这一假设:

您应该尽快

Dispose
(也“清理缓存”)DbContext,现代 C# 语法可以完美地做到这一点。

using (var context = new AppDbContext())
{
  var firstProduct = context.Products.FirstOrDefault();

  if (firstProduct != null)
  {
    // Update the price of the first product
    firstProduct.Price = 9.99m;

    // Save the changes to the database
    context.SaveChanges();
}

DbContext
本身的创建速度非常快。缓慢的部分是与 SQL Server 建立连接。这可以通过连接池轻松优化。
Program.cs
中的一行足以将其打开。

services.AddDbContext<EmployeeContext>(options => options.UseSqlServer(connection));
© www.soinside.com 2019 - 2024. All rights reserved.