EF Core如何创建DbContext EF Core创建DbContext方法

2次阅读

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

EF Core如何创建DbContext EF Core创建DbContext方法

在 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)依赖正确注册的上下文类型和配置

基本上就这些。核心就是“继承 + 构造注入 + 容器注册”,不复杂但容易忽略生命周期和配置一致性。

text=ZqhQzanResources