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 托管)项目

Blazor ASP.Net Core 3.1 Web API 在发布时返回 404 错误

Asp.NET Core进阶 第四篇 Asp.Net Core Blazor框架