如何在控制器中获取数据库上下文

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

我一整天都在尝试找出默认 MVC 6 项目的

ApplicationDbContext
中的
ManageController.cs

我上网并谷歌搜索了很多,但似乎没有人遇到与我相同的问题。这可能很简单,但我无法弄清楚。 有人有想法吗?

这是我尝试过的:

IServiceProvider service = new IServiceProvider();
var _context = service.GetService<ApplicationDbContext>();
c# .net asp.net-core asp.net-core-mvc asp.net-mvc-controller
3个回答
16
投票

使用构造函数注入:

public class ManageController
{
    private readonly ApplicationDbContext _context;

    public ManageController(ApplicationDbContext context)
    {
        _context = context;
    }
}

然后您可以在控制器方法中使用

_context
对象。文档的依赖注入部分有更多信息。


0
投票

我正在使用 Visual Studio 2015 Update 3。在 Visual Studio 的未来版本中可能不需要以下某些步骤。

  1. 使用

    No Authentification
    创建 ASP.NET Core(带有 .NET Core)项目。

  2. 在程序包管理器控制台中,依次执行以下各项。

 Install-Package Microsoft.EntityFrameworkCore.SqlServer
 Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
 Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Tools -Pre
 Install-Package Microsoft.VisualStudio.Web.CodeGenerators.Mvc -Pre
  1. 将以下内容添加到
    "tools":{}
    中定义的
    project.json
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": "1.0.0-preview2-final",
  1. 将以下内容添加到
    appsettings.json

"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=YourDatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"
},
  1. 将以下内容添加到
    ConfigureServices
    startup.cs
    之前的
    services.AddMvc();
string connection = Configuration.GetConnectionString("DefaultConnection");
services.AddDbContext<YourContextName>(options => options.UseSqlServer(connection));

0
投票

DbContext 不是线程安全的,因此如果控制器类中有多个操作,则会面临并发问题的风险。 您可以将作用域 DbContext 注入到每个控制器操作中,如下所示:

public async Task<IActionResult> Get([FromServices] ApplicationDbContext dbContext)

或者您将

DbContextFactory
注入到控制器类中,并使用
dbContextFactory.Create()

在操作中创建一个新实例
© www.soinside.com 2019 - 2024. All rights reserved.