【问题标题】:Dependency injected DbContext in a SignalR hub does not pull latest dataSignalR 集线器中注入的依赖项 DbContext 不会提取最新数据
【发布时间】:2016-11-23 00:34:18
【问题描述】:

在我的 ASP.NET Core MVC 站点中,我有一个 SignalR 集线器,将我的 DbContext 注入到构造函数中。集线器从数据库中提取数据并将其发送到 kendo ui 网格以供用户查看。此数据在选择组的那个集线器中过滤(存储在数据库中)。

组选择是在集线器的上下文之外完成的。当我更改用户选择的组时,页面会重新加载以更新各种 UI 元素。当随后调用信号器集线器时,所选组仍设置为更改前的状态。经过一番挖掘,我遇到了this issue on the signalr github。我的理解是因为集线器是瞬态的,DbContext 也是如此,并且由于集线器长时间运行,DbContext 永远不会更新。

是否有一种简单的方法可以解决这个问题,同时仍然依赖注入 DbContext 或者我是否需要为每个调用创建和处理一个新的上下文?如果是这样,那么最好的方法是什么,并且仍然从appsettings.json 传递连接字符串?

编辑

我目前使用的是Microsoft.AspNetCore.SignalR.Server,而不是新的Microsoft.AspNetCore.SignalR 库。

【问题讨论】:

  • 在现代signalr core 范围服务中,特别是DbContext 可以像在asp.net core 控制器中一样使用。看到这个answer

标签: kendo-ui signalr asp.net-core-mvc


【解决方案1】:

我可以使用Microsoft.AspNetCore.SignalR.Server 解决此问题的唯一方法是将DbContextOptionsBuilder<T> 单例添加到Startup.cs 中的ConfigureServices 方法,然后在集线器中的using(...) 中调用它。虽然我觉得这是解决问题的一种肮脏方式,但我也相信这是解决问题的唯一方法。 Microsoft 最近弃用了SignalR-Server,并正在迁移到SignalR 的新代码库。希望这个问题将在他们的新版本中得到解决。

Startup.cs

DbContextOptionsBuilder<PortalDbContext> builder = new DbContextOptionsBuilder<PortalDbContext>();
builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
services.AddSingleton(builder.Options);

中心类

using (PortalDbContext dbContext = new PortalDbContext(_dbContextOptions))
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2019-03-20
    相关资源
    最近更新 更多