- ASP.NET Core 教程
- ASP.NET Core - 首頁
- ASP.NET Core - 概述
- ASP.NET Core - 環境設定
- ASP.NET Core - 新建專案
- ASP.NET Core - 專案結構
- ASP.NET Core - project.json
- ASP.NET Core - 配置
- ASP.NET Core - 中介軟體
- ASP.NET Core - 異常處理
- ASP.NET Core - 靜態檔案
- ASP.NET Core - 設定 MVC
- ASP.NET Core - MVC 設計模式
- ASP.NET Core - 路由
- ASP.NET Core - 屬性路由
- ASP.NET Core - Action 結果
- ASP.NET Core - 檢視
- 設定 Entity Framework
- ASP.NET Core - DBContext
- ASP.NET Core - Razor 佈局檢視
- ASP.NET Core - Razor 檢視啟動
- ASP.NET Core - Razor 檢視匯入
- ASP.NET Core - Razor 標籤助手
- ASP.NET Core - Razor 編輯表單
- ASP.NET Core - Identity 概述
- ASP.NET Core - Authorize 屬性
- Identity 配置
- ASP.NET Core - Identity 遷移
- ASP.NET Core - 使用者註冊
- ASP.NET Core - 建立使用者
- ASP.NET Core - 登入和登出
- ASP.NET Core 有用資源
- ASP.NET Core - 快速指南
- ASP.NET Core - 有用資源
- ASP.NET Core - 討論
ASP.NET Core - DBContext
Entity Framework 允許您使用稱為實體的公共語言執行時 (CLR) 物件查詢、插入、更新和刪除資料。Entity Framework 將模型中定義的實體和關係對映到資料庫。它還提供以下功能:
將從資料庫返回的資料具體化為實體物件。
跟蹤對物件的更改。
處理併發。
將物件更改傳播回資料庫。
將物件繫結到控制元件。
負責以物件形式與資料互動的主要類是 DbContext。使用上下文建議的方法是定義一個從 DbContext 派生的類,並公開表示上下文中指定實體集合的 DbSet 屬性。
從邏輯上講,一個 DBContext 對映到具有 DBContext 理解的架構的特定資料庫。在該 DBContext 類上,您可以建立型別為 DbSet<T> 的屬性。泛型型別引數 T 將是實體的型別,例如,Employee 是 FirstAppDemo 應用程式中的一個實體。
示例
讓我們來看一個簡單的例子,我們將建立一個 DbContext 類。在這裡,我們需要在 Models 資料夾中新增一個新類,並將其命名為 **FirstAppDempDbContext**。儘管這個類本身並不是一個模型,但它確實整合了我們所有的模型,以便我們可以將它們與資料庫一起使用。
從位於 Miscrosoft.Data.Entity 名稱空間中的 DbContext 類繼承您的上下文類。現在在該類上實現 Employee 的 DbSet。
每個 DbSet 將對映到資料庫中的一個表。如果您有一個 employee 的 DbSet 屬性,並且該屬性的名稱是 Employees,則 Entity Framework 預設情況下會在您的資料庫中查詢 Employees 表。
using FirstAppDemo.Models;
using Microsoft.Data.Entity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace OdeToFood.Models {
public class FirstAppDemoDbContext : DbContext {
public DbSet<Employee> Employees { get; set; }
}
}
實現非常簡單,因為我們只有一個模型要處理。我們只需要一個屬性,即 Employee 的 **DbSet**,我們可以將此屬性命名為 **Employees**。
現在讓我們直接將此類插入控制器,然後控制器可以使用 **FirstAppDemoDbContext** 來查詢資料庫。我們將透過向 HomeController 類新增一個新類來簡化所有這些操作,在該類中,我們實現新增員工和獲取員工的方法,如下面的程式所示。
using Microsoft.AspNet.Mvc;
using FirstAppDemo.ViewModels;
using FirstAppDemo.Services;
using FirstAppDemo.Entities;
using FirstAppDemo.Models;
using System.Collections.Generic;
using System.Linq;
namespace FirstAppDemo.Controllers {
public class HomeController : Controller {
public ViewResult Index() {
var model = new HomePageViewModel();
using (var context = new FirstAppDemoDbContext()) {
SQLEmployeeData sqlData = new SQLEmployeeData(context);
model.Employees = sqlData.GetAll();
}
return View(model);
}
}
public class SQLEmployeeData {
private FirstAppDemoDbContext _context { get; set; }
public SQLEmployeeData(FirstAppDemoDbContext 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 方法中,它將根據 ID 返回員工。而在 GetAll 方法中,它將返回資料庫中所有員工的列表。
配置 Entity Framework 服務
要擁有可用的 Entity Framework DBContext,我們需要更改應用程式的配置。我們需要新增一個連線字串,以便我們的 DBContext 知道要連線到哪個伺服器以及要查詢哪個資料庫。
我們將連線字串放在 JSON 配置檔案中。
我們還需要在 Startup 類的 ConfigureServices 方法中新增更多服務。
Entity Framework 與 ASP.NET 和 MVC 框架一樣,依賴於依賴注入,為了使注入工作,執行時需要知道 Entity Framework 使用的各種服務。
有一個簡單的配置 API 將新增我們需要的所有預設服務。
讓我們轉到 AppSettings.json 檔案並新增連線字串,如下面的程式所示。
{
"message": "Hello, World! this message is from configuration file...",
"database": {
"connection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=FirstAppDemo"
}
}
現在讓我們轉到 Startup 類,我們需要為 Entity Framework 新增一些額外的服務才能使其正常工作。具體來說,我們需要做三件事與 Entity Framework 相關:
我們需要新增核心 Entity Framework 服務。
我們還需要新增與 SQL Server 相關的 Entity Framework 服務。
我們需要告訴 Entity Framework 關於我們的 DBContext。
所有這些都可以透過作為 **IServiceCollection** 的擴充套件方法提供的方法來完成,如下面的程式所示。
public void ConfigureServices(IServiceCollection services) {
services.AddMvc();
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<FirstAppDemoDbContext>
(option => option.UseSqlServer(Configuration["database:connection"]));
}
第一個方法是 **AddEntityFramework**。這將新增核心 Entity Framework 服務,即預設服務。
但是,由於 Entity Framework 現在設計為可以與各種型別的資料庫(包括非關係型資料庫)一起工作,因此我們需要進行第二次呼叫以告訴 Entity Framework 新增其預設的與 SQL Server 相關的服務。
然後,我們還需要告訴 Entity Framework 關於我的 **DBContext** 類,以便它可以適當地構造該類的例項,我們可以透過第三種方法 **AddDbContext** 方法來實現。
此方法採用一個泛型型別引數,我們在此引數中指定 DBContext 派生類的型別,即 **FirstAppDemoDbContext**。
在 AddDbContext 內部,我們需要描述我們 DBContext 的選項。
這可以透過 **lambda 表示式** 來完成;這是一個操作,我們接收一個選項引數,並且 Entity Framework 可以支援不同的資料庫。我們只需要告訴 Entity Framework 此特定 DBContext 將 **UseSqlServer**。
此方法需要一個引數,即要使用的 **connectionString**。
以下是 **Startup.cs** 檔案的完整實現。
using Microsoft.AspNet.Mvc;
using FirstAppDemo.ViewModels;
using FirstAppDemo.Services;
using FirstAppDemo.Entities;
using FirstAppDemo.Models;
using System.Collections.Generic;
using System.Linq;
namespace FirstAppDemo.Controllers {
public class HomeController : Controller {
public ViewResult Index() {
var employee = new Employee { Id = 1, Name = "Mark Upston1" };
using (var context = new
FirstAppDemoDbContext()) {
SQLEmployeeData sqlData = new SQLEmployeeData(context);
sqlData.Add(employee);
}
//var employee = new Employee { ID = 1, Name = "Mark Upston" };
return View(employee);
}
}
public class SQLEmployeeData {
private FirstAppDemoDbContext _context { get; set; }
public SQLEmployeeData(FirstAppDemoDbContext 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>();
}
}
}
現在我們需要設定資料庫。設定資料庫的一種方法是使用 Entity Framework 建立資料庫,這是一個兩步過程:
第一步
這包括以下內容:
向我們的專案新增遷移程式碼。
遷移程式碼是 **C#** 程式碼。這可以執行以在資料庫中建立資料庫模式。
Entity Framework 可以為我們生成此遷移程式碼。
Entity Framework 檢視資料庫和我們的模型,並找出使應用程式工作所需的模式更改。
因此,當我們新增其他模型或對現有模型(如 Employee 類)進行更改時,我們可以繼續向專案新增遷移,並使我們的資料庫模式保持同步。
第二步
這包括以下內容:
在這裡,我們需要顯式地應用這些遷移來更新資料庫。
這兩個任務都可以透過從控制檯視窗使用一些簡單的命令來實現。
我們已經建立了 project.json。
這就是為什麼我們建立 project.json 來新增一個命令,其中“ef”對映到 EntityFramework.Commands。
讓我們開啟 Visual Studio 的開發者命令提示符來執行我們需要新增遷移和應用遷移的命令。最簡單的方法是轉到應用程式根目錄。
如果您在包含 project.json 檔案的資料夾中,那麼您就在正確的資料夾中。在這裡,我們需要執行一個稱為 dnvm 的命令。這是 .NET 版本管理器,它將告訴系統我們要使用哪個執行時。
現在讓我們使用以下命令。
dnvm list
按 Enter 鍵後,您將看到以下輸出。
我們需要告訴 **dnvm** 我們想要使用特定的執行時。這將使我們能夠訪問我們要執行的 dotnet 命令或 dnx 命令。
執行以下命令。
dnvm use1.0.0-rc1-update1 -p
按 Enter 鍵。
**dnvm** 將設定我們的路徑和環境變數以包含一個 bin 目錄,這將使我們能夠訪問此 dnx 實用程式。讓我們執行 **dnx ef** 命令。
這是 .NET 執行環境,使用 dnx,我們可以呼叫我們在 project.json 檔案中列出的命令。執行這些命令通常非常容易。當您鍵入 dnx ef 時,您將獲得一個幫助螢幕。您不必記住所有選項。您可以從 Entity Framework 命令中檢視可用的命令,其中有三個。
首先,我們需要新增遷移來執行以下命令。
dnx ef migrations add v1
按 Enter 鍵。
Entity Framework 將找到該上下文並檢視其中的模型。它將知道沒有之前的遷移,因此它將生成第一個遷移。在這裡,v1 是資料庫的版本 1。它將在解決方案資源管理器中建立一個新資料夾並生成程式碼。
遷移本質上是用於生成 SQL 命令以修改 SQL 資料庫中模式的 C# 程式碼。
using System;
using System.Collections.Generic;
using Microsoft.Data.Entity.Migrations;
using Microsoft.Data.Entity.Metadata;
namespace FirstAppDemo.Migrations {
public partial class v1 : Migration {
protected override void Up(MigrationBuilder migrationBuilder) {
migrationBuilder.CreateTable(name: "Employee", columns: table => new {
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy",
SqlServerValueGenerationStrategy.IdentityColumn),
Name = table.Column<string>(nullable: true)
},
constraints: table => {
table.PrimaryKey("PK_Employee", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder) {
migrationBuilder.DropTable("Employee");
}
}
}
您可以看到它將建立一個名為 Employees 的表。
此表應有兩個列——一個 ID 列和一個 Name 列。
按照約定,當 Entity Framework 看到您有一個名為 Id 的屬性時,它將使該屬性或更確切地說,使該列成為資料庫中的主鍵。
在這裡,我們將使用 SQL Server。預設情況下,Entity Framework 將使其成為 IdentityColumn,這意味著 SQL Server 將為我們生成 ID。
讓我們透過鍵入“**dnx ef database update**”命令將這些 ID 應用到資料庫。
您可以看到該命令已應用遷移。
現在讓我們轉到 SQL Server 物件資源管理器,並重新整理資料庫,您現在可以看到我們有一個 FirstAppDemo 資料庫。
您還可以看到我們的 Employee 表,我們甚至可以檢視該表的列,其中 ID 列是主鍵。
讓我們右鍵單擊 dbo.Employee 表並選擇“檢視資料”。
在執行應用程式之前,讓我們新增一些資料。當我們啟動應用程式時,我們應該看到來自資料庫的一些資料。
讓我們在這裡新增幾行資料。
現在讓我們更新 index.cshtml 檔案。它以表格形式顯示所有資料。
@model FirstAppDemo.Controllers.HomePageViewModel
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Home</title>
</head>
<body>
<h1>Welcome!</h1>
<table>
@foreach (var employee in Model.Employees) {
<tr>
<td>
@Html.ActionLink(employee.Id.ToString(), "Details", new
{ id = employee.Id })
</td>
<td>@employee.Name</td>
</tr>
}
</table>
</body>
</html>
執行應用程式後,它應該產生以下輸出。