ASP.NET Core Blazor 服务器中的实体框架上下文生命周期
Posted
技术标签:
【中文标题】ASP.NET Core Blazor 服务器中的实体框架上下文生命周期【英文标题】:Entity Framework Context Lifetime in ASP.NET Core Blazor Server 【发布时间】:2021-08-25 22:32:27 【问题描述】:我的问题是当我对上下文执行 CRUD 操作时,我的组件中没有进行更改。
DbContext 注册如下:
services.AddDbContextFactory<DBContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("my_ConnectionStrings")),
lifetime: ServiceLifetime.Transient);
在上面的代码中,我将ServiceLifetime
配置为Transient
。因此,每次请求时都必须创建一个新的服务实例。
这是我的代码:
[Inject] IDbContextFactory<DBContext> DbFactory;
private string updateMessage(int messageID)
DBContext _context = DbFactory.CreateDbContext();
var result = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
if (result != null)
result.LastUpdate= DateTime.Now.ToString("HH:mm:ss");
_context.SaveChanges();
var assert = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
return "Last update is: " + assert.LastUpdate;
在上面的代码中,我将工厂注入到我的组件中并创建了新实例。但是我的组件中没有考虑上下文更改。我想观察我的组件的上下文变化。
在上面的代码中,我修改了上下文,但没有任何变化,方法返回之前的值LastUpdate
。
【问题讨论】:
您的 UI 代码是什么样的?您是否有任何绑定到该字段以触发更新? 【参考方案1】:在 Blazor Server 中,范围服务注册可能会出现问题,因为该实例在用户电路中的组件之间共享。 DbContext 不是线程安全的,也不是为并发使用而设计的。现有的生命周期是不合适的。欲了解更多信息,请参阅ASP.NET Core Blazor Server with Entity Framework Core。
您应该创建一个新的 DbContext 实例。创建新 DbContext 实例的一种方法是使用 using
语句。
试试这个代码:
[Inject] IDbContextFactory<DBContext> DbFactory;
private string updateMessage(int messageID)
using (DBContext _context = DbFactory.CreateDbContext())
var result = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
if (result != null)
result.LastUpdate= DateTime.Now.ToString("HH:mm:ss");
_context.SaveChanges();
var assert = new Messages();
using (DBContext _context = DbFactory.CreateDbContext())
assert = _context.Messages.FirstOrDefault(s => s.MessageID == messageID);
return "Last update is: " + assert.LastUpdate;
【讨论】:
以上是关于ASP.NET Core Blazor 服务器中的实体框架上下文生命周期的主要内容,如果未能解决你的问题,请参考以下文章
如何对 asp.net core Blazor App 中的 oAuth 身份验证进行故障排除
Blazor 无法连接到 ASP.NET Core WebApi (CORS)
在 ASP.NET Core 站点中实现 Blazor - 组件不在视图中呈现
从模板 Visual Studio 创建 Blazor(ASP.NET Core 托管)项目