在 EF Core 中创建
DbContext主要通过继承
DbContext类并重写其构造函数和
OnModelCreating方法来实现,核心是配置数据库连接与实体映射关系。
定义自定义 DbContext 类
新建一个类(如
AppDbContext),继承
Microsoft.EntityFrameworkCore.DbContext,并在构造函数中接收
DbContextOptions<tcontext></tcontext>参数: 这是 EF Core 推荐的构造方式,支持依赖注入和多种配置来源(如连接字符串、内存数据库等) 必须调用基类构造函数
base(options)通常在
OnModelCreating中配置实体关系、索引、约束等 Fluent API 规则 示例:
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Post>()
.HasOne(p => p.Blog)
.WithMany(b => b.Posts)
.HasForeignKey(p => p.BlogId);
}
}
注册 DbContext 到服务容器
在
Program.cs(.NET 6+)或
Startup.cs中,使用
AddDbContext<tcontext></tcontext>将上下文注册为服务: 推荐使用
AddDbContextPool提升高并发场景性能(连接池复用) 连接字符串一般从配置文件(如
appsettings.json)读取,避免硬编码 可指定生命周期:Scoped(默认,每个请求一个实例)、Transient 或 Singleton(慎用) 示例(Program.cs):
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(connectionString));
手动创建 DbContext 实例(不推荐常规使用)
仅在测试、控制台工具或无 DI 环境下临时使用,需自行管理生命周期和连接:
创建DbContextOptionsBuilder,调用
UseSqlServer等方法配置提供程序 构建
DbContextOptions<t></t>后传入构造函数 务必手动调用
Dispose()或使用
using语句释放资源 示例:
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseSqlServer("Server=.;Database=TestDb;Trusted_Connection=true;")
.Options;
using var context = new AppDbContext(options);
var blogs = context.Blogs.ToList();
常见注意事项
避免踩坑的关键点:
不要在DbContext中存储静态连接或共享
DbSet实例 确保每个线程/请求使用独立的
DbContext实例(Scoped 生命周期已保障) 若启用延迟加载,需安装
Microsoft.EntityFrameworkCore.Proxies并调用
UseLazyLoadingProxies()迁移命令(如
dotnet ef migrations add)依赖正确注册的上下文类型和配置
基本上就这些。核心就是“继承 + 构造注入 + 容器注册”,不复杂但容易忽略生命周期和配置一致性。
