ASP.NET Core 数据库上下文 DBContext

DBContext

Entity Framework 让您使用公共语言运行时(CLR)对象(称为实体)查询、插入、更新和删除数据。Entity Framework 将模型中定义的实体和关系映射到数据库。它还为以下功能:

  • 将从数据库返回的数据具体化为实体对象。
  • 跟踪对对象所做的更改。
  • 处理并发。
  • 将对象更改回传数据库。
  • 将对象绑定到控件。

负责作为对象与数据交互的主要类是 DbContext。使用上下文的推荐方法是定义从 DbContext 派生的类,并公开表示上下文中指定实体集合的 DbSet 属性。

从逻辑上讲,DBContext 映射到具有 DBContext 可理解的模式的特定数据库。在该 DBContext 类上,可以创建 DbSet<T> 类型的属性。泛型类型参数 T 将是一种实体类型,如 EmployeeMyFirstCoreWebApp 应用程序中的实体。


配置 DbContext

下面开始配置和初始化数据库上下文类 DbContext

通过 ASP.NET Core 依赖关系注入

在文件 Startup.csConfigureServices 方法中添加以下代码:

  1. services.AddDbContext<MyFirstCoreWebAppDbContext>(options => options.UseSqlServer("Data Source=.;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=123456"));

或者通过 appsettings.json 文件配置数据库连接字符串:

  1. "ConnectionStrings": {
  2. "DefaultConnection": "Data Source=.;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=123"
  3. }

同时 Startup.csConfigureServices 方法中的代码改成如下:

  1. services.AddDbContext<ShoppingCenterContext>(options=>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

然后我们将创建一个 DbContext 类。这里,我们需要在 Models 文件夹中添加一个新类,并将其称为 MyFirstCoreWebAppDbContext。尽管这个类本身不是一个模型,但它确实将我们所有的模型放在一起,以便我们可以在数据库中使用它们。

类 MyFirstCoreWebAppDbContext 必须添加有一个参数 DbContextOptions<MyFirstCoreWebAppDbContext> 的公共构造函数,代码如下:

  1. public class MyFirstCoreWebAppDbContext: DbContext
  2. {
  3. public MyFirstCoreWebAppDbContext(DbContextOptions<MyFirstCoreWebAppDbContext> options) : base(options)
  4. {
  5. }
  6. }

配置完毕后,我们就可以在 ASP.NET Core 控制器或其他服务中通过构造函数注入 MyFirstCoreWebAppDbContext,如:

  1. namespace MyFirstCoreWebApp.Controllers
  2. {
  3. public class HomeController : Controller
  4. {
  5. private readonly MyFirstCoreWebAppDbContext _context;
  6. public HomeController(MyFirstCoreWebAppDbContext context)
  7. {
  8. //通过构造函数注入数据库上下文
  9. _context = context;
  10. }
  11. }
  12. }

使用 new 方法创建

MyFirstCoreWebAppDbContext 中重写方法 OnConfiguring 就可以配置数据库连接字符串:

  1. namespace MyFirstCoreWebApp.Models
  2. {
  3. public class MyFirstCoreWebAppDbContext: DbContext
  4. {
  5. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  6. {
  7. optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=123456");
  8. }
  9. }
  10. }

或者通过构造函数来传递数据库连接字符串:

  1. namespace MyFirstCoreWebApp.Models
  2. {
  3. public class MyFirstCoreWebAppDbContext : DbContext
  4. {
  5. private readonly string _connectionsString;
  6. public MyFirstCoreWebAppDbContext(string connectionsString)
  7. {
  8. _connectionsString = connectionsString;
  9. }
  10. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  11. {
  12. optionsBuilder.UseSqlServer(_connectionsString);
  13. }
  14. }
  15. }

然后代码中就可以这样创建数据库上下文类:

  1. var _context=new MyFirstCoreWebAppDbContext();

或者

  1. var str="Server=.;Database=program;User ID=sa;Password=123456";
  2. var _context=new MyFirstCoreWebAppDbContext(str);

使用 DbContext 工厂

使用工厂方法也是在 Startup.cs 文件的 ConfigureServices 方法中注册:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDbContextFactory<MyFirstCoreWebAppDbContext>(options => options.UseSqlServer("Data Source=localhost;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=xiaozi141"));
  4. }

注意方法改成 AddDbContextFactory。与上面的类一样 MyFirstCoreWebAppDbContext 必须公开具有DbContextOptions<MyFirstCoreWebAppDbContext> 参数的构造函数:

  1. public class MyFirstCoreWebAppDbContext: DbContext
  2. {
  3. public MyFirstCoreWebAppDbContext(DbContextOptions<MyFirstCoreWebAppDbContext> options) : base(options)
  4. {
  5. }
  6. }

然后通过构造函数注入 DbContext 工厂并且通过工厂构造 DbContext 实例:

  1. public class HomeController : Controller
  2. {
  3. private readonly IDbContextFactory<MyFirstCoreWebAppDbContext> _contextFactory;
  4. public HomeController(IDbContextFactory<MyFirstCoreWebAppDbContext> contextFactory)
  5. {
  6. //通过构造函数注入数据库上下文
  7. _contextFactory = contextFactory;
  8. }
  9. public void GetData()
  10. {
  11. using (var context = _contextFactory.CreateDbContext())
  12. {
  13. //...
  14. }
  15. }
  16. }

需要注意的是,以这种方式创建的 DbContext 实例并非由应用程序的服务提供程序进行管理,因此必须由应用程序释放,比如上图所示的使用 using(…),用完后立即释放。

配置完毕后,和数据库进行交互的通道就打开了,剩下的工作就是准备并组织好数据,把交由数据库上下文对象处理就可以了。

分类导航