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<AppDbContext>(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<IActionResult> Index() =>
View(await _context.Products.ToListAsync());
}
异步方法(ToListAsync、
FirstOrDefaultAsync)应优先使用,避免线程阻塞 避免在 View 中直接调用
_context.Xxx—— 违反分层原则,也容易引发延迟加载异常 简单查询可直接用,复杂逻辑建议抽到 Repository 或 Service 层(按项目规模决定)
基本上就这些。EF Core 和 MVC 配合很自然,重点是别绕过 DI、别手动管理上下文、别在视图里查数据。做对这三点,基础应用就很稳了。
