ASP.NET Core MVC 中使用 EF Core 的核心是解耦数据访问与 Web 层并依托 DI 管理 DbContext 生命周期。需安装对应 NuGet 包,定义模型与 DbContext,通过 AddDbContext 注册到 DI 容器,Controller 中构造函数注入使用,优先异步操作,避免手动创建或视图中查询。

ASP.NET Core MVC 中使用 EF Core,核心是把数据访问逻辑和 Web 层解耦,同时利用依赖注入(DI)自动管理 DbContext 生命周期。关键不是“能不能用”,而是“怎么组织更清晰、安全、可维护”。
1. 安装 EF Core 和数据库提供程序
在项目中安装对应 NuGet 包,比如 SQL Server:
- Microsoft.EntityFrameworkCore.SqlServer(主数据库驱动)
-
Microsoft.EntityFrameworkCore.Tools(支持迁移命令,如
dotnet ef migrations add) - 如果用 SQLite 或 PostgreSQL,换对应提供程序即可
2. 定义模型与 DbContext
先写实体类(比如 Product.cs),再创建继承 DbContext 的类(比如 AppDbContext.cs):
- 在
OnModelCreating中配置关系、索引、种子数据(可选) - 不要在 DbContext 构造函数里写业务逻辑,保持轻量
- 确保每个 DbContext 实例只服务一次请求(默认 Scoped 模式已满足)
3. 注册 DbContext 到 DI 容器
在 Program.cs(.NET 6+)中配置:
builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
- 连接字符串从
appsettings.json读取,便于环境切换 - 不推荐手动 new DbContext,避免生命周期混乱和内存泄漏
- 如需不同连接或上下文隔离(如多租户),可用命名注册或工厂模式
4. 在 Controller 中使用(推荐方式)
通过构造函数注入 DbContext,而不是在 Action 里 new:
public class ProductsController : Controller
{
private readonly AppDbContext _context;
public ProductsController(AppDbContext context) => _context = context;
public async Task Index() =>
View(await _context.Products.ToListAsync());
}
- 异步方法(
ToListAsync、FirstOrDefaultAsync)应优先使用,避免线程阻塞 - 避免在 View 中直接调用
_context.Xxx—— 违反分层原则,也容易引发延迟加载异常 - 简单查询可直接用,复杂逻辑建议抽到 Repository 或 Service 层(按项目规模决定)
基本上就这些。EF Core 和 MVC 配合很自然,重点是别绕过 DI、别手动管理上下文、别在视图里查数据。做对这三点,基础应用就很稳了。










