ASP.NET Core 数据库上下文
上一章节中我们了解了 Entity Framework 并讲述了如何配置它。本章节我们就来学习如何使用它
EF 框架 ( Entity Framework ) 使我们能够使用称为实体 ( Entity) 的公共语言运行时 ( CLR ) 对象查询,插入,更新和删除数据
EF 框架将模型中定义的实体和关系映射到数据库。除此之外,它还具有以下能力:
- 将从数据库返回的数据实体化为实体对象
- 跟踪我们对实体对象所做的更改
- 并发处理特性
- 将对象的更改更新到数据库
- 将对象绑定到控件
DBContext
EF 框架中,将数据视为对象并负责与之进行交互的主类是 DbContext
使用 DbContext 上下文的时候,我们推荐你定义一个从 DbContext
派生的类,并且定义一个公开的 DbSet 属性用于表示上下文中指定的实体集合
从逻辑上讲,DBContext 映射到具有 DBContext 可理解的表的特定数据库
在 DBContext 子类中,我们可以创建类型为 DbSet<T>
的属性。
泛型类型参数 T
将是一种类型的实体,如 Employee
是 HelloWorld 应用程序中的一个实体
范例
现在,我们使用一个简单的范例来演示下 DBContext 的使用
我们将创建一个 HelloWorldDBContext
类继承自 DbContext
类
我们把 HelloWorldDBContext
类放到 Models
文件夹中,尽管这个类本身并不是一个模型,但它将所有模型放在一起,以便我们可以将它们与数据库一起使用
创建 HelloWorldDBContext
类的方法很简单,我们就不再详细介绍了,创建成功后的目录结构如下
而 HelloWorldDBContext
的原始内容如下
using System; using Microsoft.EntityFrameworkCore; namespace HelloWorld.Models { public class HelloWorldDBContext:DbContext { public HelloWorldDBContext() { } } }
我们的 HelloWorldDBContext
类继承了命名空间 Microsoft.EntityFrameworkCore
中类 DbContext
。
我们需要在自己的 HelloWorldDBContext
类中实现一个 Employee
类型的 DbSet
每个 DbSet
将映射到数据库中的一个表
如果我们有一个 DbSet<Employee>
类型的属性,并且该属性的名称是 Employees
,则 EF 框架将默认在数据库中查找 Employees
表
using System; using Microsoft.EntityFrameworkCore; using HelloWorld.Models; namespace HelloWorld.Models { public class HelloWorldDBContext:DbContext { public HelloWorldDBContext(){} public HelloWorldDBContext(DbContextOptions<HelloWorldDBContext> options) : base(options) { } public DbSet<Employee> Employees { get; set; } } }
我们首先要修改的就是添加另一个构造函数,该构造函数中接受一个 DbContextOptions<TContext>
对象并将其传递给 DbContext
的基础构造函数
我们的 HelloWorldDBContext
非常简单,因为我们只有一个模型可以使用。
我们只需要一个属性 DbSet<Employee>
,我们将这个属性命名为 Employees
现在,我们直接将这个类插入到控制器中,然后控制器可以使用 HelloWorldDBContext
来查询数据库。
我们将通过向 HomeController
类添加一个新类来简化所有这些,在该类中我们实现了添加 employee
和获取 employee
的方法,如下面的程序所示
HomeController.cs
using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.Linq; using HelloWorld.Models; namespace HelloWorld.Controllers { public class HomeController: Controller { public ViewResult Index() { var model = new HomePageViewModel(); using (var context = new HelloWorldDBContext()) { SQLEmployeeData sqlData = new SQLEmployeeData(context); model.Employees = sqlData.GetAll(); } return View(model); } } public class SQLEmployeeData { private HelloWorldDBContext _context { get; set; } public SQLEmployeeData(HelloWorldDBContext context) { _context = context; } public void Add(Employee emp) { _context.Add(emp); _context.SaveChanges(); } public Employee Get(int ID) { return _context.Employees.FirstOrDefault(e => e.ID == ID); } public IEnumerable<Employee> GetAll() { return _context.Employees.ToList<Employee>(); } } public class HomePageViewModel { public IEnumerable<Employee> Employees { get; set; } } }
上面的 SQLEmployeeData
类中,我们定义了 Add
、Get
和 GetAll
三个方法
Add
方法向上下文添加一个新的员工对象,然后再保存更改。Get
方法根据 ID 返回一个员工GetAll
方法返回数据库中所有员工的列表
好了,本小节就到这里结束吧,我们下一章节再将如何配置 EF 框架服务