原文:ASP.NET Core 數據庫上下文 - ASP.NET Core 基礎教程 - 簡單教程,簡單編程
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 框架服務