在 ef core 中创建 dbcontext 需继承 dbcontext 类,重写构造函数(接收 dbcontextoptions 并调用 base(options))和 onmodelcreating 方法配置映射;通过 adddbcontext 在服务容器注册,推荐 scoped 生命周期和连接池;手动实例化仅限测试等场景,须注意 dispose。

在 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(慎用)
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)依赖正确注册的上下文类型和配置
基本上就这些。核心就是“继承 + 构造注入 + 容器注册”,不复杂但容易忽略生命周期和配置一致性。










