发布
社区首页 >问答首页 >如何在asp.net核心2中的静态方法/类中访问db上下文

如何在asp.net核心2中的静态方法/类中访问db上下文
EN

Stack Overflow用户
提问于 2020-02-05 02:57:18
回答 1查看 3.4K关注 0票数 2

我有一个带有EF 6的asp.net核心2 way应用程序。到目前为止,我使用db上下文的方式是使用asp.net核心提供的依赖注入将上下文注入控制器:

代码语言:javascript
代码运行次数:0
复制
protected DbContext dbContext;

public BaseController(DbContext context)
{
    dbContext = context;
}

在我的许多剃须刀视图中,我调用一个扩展方法来初始化telerik网格,并传递选项。到目前为止,我还不需要访问db上下文,但是现在我需要在扩展方法中对某些逻辑进行访问:

代码语言:javascript
代码运行次数:0
复制
    public static GridBuilder<T> BaseProcessGrid<T>(this GridBuilder<T> helper, string controllerName, string gridName)
       where T : class, IProcessViewModel
    {
        bool showDelete = false;

        //check if the current user has edit rights 
        using (var db = new DbContext())
        {
            var users = db.Users.ToList(); // <--- this just doesn't get any records.
        }

当尝试从静态方法中实例化一个新的db上下文时,它只是不获取任何记录。我需要弄清楚如何实际访问DbContext的新实例,或者以某种方式访问Startup.cs中定义的作用域服务:

代码语言:javascript
代码运行次数:0
复制
services.AddScoped(_ => new MantleMapperContext(Configuration.GetConnectionString("DbContext")));

编辑:

如下所示,我最终将dbContext服务直接注入到我的视图中,然后将其传递到方法中,如下所示:

代码语言:javascript
代码运行次数:0
复制
@inject DbContext dbContext
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-05 03:15:37

您必须传递您的DbContext,或者从容器中获得一个实例,您也需要一个静态引用(这将导致大多数代码评审失败)。

执行您所做的操作时,它将在没有连接字符串的情况下进行初始化,因为当注入连接字符串时,就会出现这种情况。

因为这是static,所以最简洁的解决方案就是传递DbContext

代码语言:javascript
代码运行次数:0
复制
public static GridBuilder<T> BaseProcessGrid<T>(this GridBuilder<T> helper, DbContext db, string controllerName, string gridName)
   where T : class, IProcessViewModel
{
    bool showDelete = false;

    var users = db.Users.ToList(); // <--- gets records.

更新

在剃须刀的视野里我该怎么做?

我相信你可以将服务注入视图。

服务注入

可以使用@inject指令将服务注入视图。您可以认为@inject是将属性添加到视图中,并使用DI填充属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60068406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档