gpt4 book ai didi

c# - 使用 EF7 和 VNext 访问 DBContext

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:52 27 4
gpt4 key购买 nike

在我的 MVC 6 项目中,我有我的 ApplicationDBContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
protected override void OnModelCreating(ModelBuilder builder)
{

}
}

这是在 Startup.cs 中添加到我的服务中的

public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
//Other configurations removed for brevity
}

现在当我创建一个新的 Controller 时,它会询问我是否要使用 Entity Framework,我可以选择我的数据上下文。创建该 Controller 时,使用我假设的依赖注入(inject)将上下文传递到构造函数中。

public class CompanyController : Controller
{
private ApplicationDbContext _context;

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

现在,我不想在 Controller 中进行所有数据库交互,而是在我的其他类中进行。我想不通的是如何从其他类中获取 ApplicationDbContext。从 Controller 传递它显然是行不通的,因为可以从 Controller 以外的其他地方调用类。

如果我只是尝试 new ApplicationDbContext(); 我会收到以下错误:

No database providers are configured. Configure a database provider by overriding OnConfiguring in your DbContext class or in the AddDbContext method when setting up services.

我觉得这应该很简单,但我完全迷失在这里。

最佳答案

ASP.NET Core 基于依赖注入(inject),因为你的上下文已经被添加到你的依赖容器中,当你的 Controller 被实例化时,它会被框架自动注入(inject)。

根据评论编辑:

您可以设置类来支持 DI,假设您有两个类。一个取决于您的上下文,然后第二个取决于您的上下文和您的第一个类:

public class MyClass
{
private ApplicationDbContext _context;

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

public class AnotherClass
{
private ApplicationDbContext _context;
private MyClass _myClass;

public AnotherClass(ApplicationDbContext context, MyClass myClass)
{
_context = context;
_myClass = myClass;
}
}

在启动时将您的类作为临时依赖项添加到服务集合中,并让服务提供者为您解决它们的依赖项:

public void ConfigureServices(IServiceCollection services)
{
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));

services.AddTransient<MyClass>();
services.AddTransient<AnotherClass>();

//Other configurations removed for brevity
}

更改您的 Controller 以接受 MyClass 作为注入(inject)的依赖项:

public class CompanyController : Controller
{
private ApplicationDbContext _context;
private MyClass _myClass;

public CompanyController(ApplicationDbContext context, MyClass myClass)
{
_context = context;
_myClass = myClass;
}
}

你也可以有另一个 Controller ,将 AnotherClass 作为注入(inject)的依赖:

public class AnotherController : Controller
{
private AnotherClass _anotherClass;

public AnotherController(AnotherClass anotherClass)
{
_anotherClass = anotherClass;
// _anotherClass will have both ApplicationDbContext and MyClass injected by the service provider
}
}

您应该阅读 docs ASP.NET Core 的依赖注入(inject),它可以帮助理解 DI 的基础知识。另一个article来自 K. Scott Allen,解释了处理 DI 时的一些不良做法。

关于c# - 使用 EF7 和 VNext 访问 DBContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36636410/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com