本節中,將學習添加用於管理跨平台的SQLLite數據庫中的電影的類Movie。從ASP.NET core 模板創建的應用使用SQLLite數據庫。
應用模型類(Movie)配合Entity Framework core(簡稱EF core,這是一種對象關系映射框架(ORM),它可以簡化數據訪問)使用,以處理數據庫
模型類稱為POCO類,因為它們與EF Core 沒有任何依賴關系。它定義了數據庫中存儲的數據屬性。
一、添加數據模型“Movie”
1、右鍵單擊“RazorPagesMovie”項目>"添加">"新建文件夾"。並命名為“Models”
2、右鍵“Models”文件夾,選擇“添加”>"類",並將新類命名為“Movie”:
3、雙擊Movie.cs文件,並添加以下屬性:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; //需要手動引用這個名稱控件 using System.Linq; using System.Threading.Tasks; namespace RazorPagesMovie.Models { public class Movie { public int ID { get; set; } //定義數據庫的主鍵 public string Title { get; set; } //電影名稱 //DataType屬性指定數據的類型是日期。通過此用法:1、用戶無需在數據字段中輸入時間信息(系統會自動提供一個日期控件);2、僅顯示日期,不顯示時間信息 //這個需要引用System.ComponentModel.DataAnnotations 名稱空間 [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } //電影發行日期 public string Genre { get; set; } // 電影的流派、主題 public decimal Price { get; set; } //電影價格 } }
4、‘生成解決方法’,確保沒有編譯錯誤:
二、搭建“Movie”模型的基架
此部分,將使用基架工具生成頁面,用於對“Movie”模型執行創建、讀取、更新、刪除操作。俗稱CRUD。
1、創建Pages/Movies文件夾:
右鍵“Pages”文件夾>"添加">“新建文件夾”,並將新文件夾命名為“Movies”:
2、在新建的Movies文件夾上右鍵單擊>"添加">"新搭建基架的項目"
在彈出的“添加已搭建基架的新項”對話框中,選擇“使用實體框架生成Razor頁面(CRUD)”之后,點擊“添加”:
在彈出的“添加使用實體框架生成Razor頁面(CRUD)”對話框中操作如下:
‘模型類’的下拉列表中選擇“Movie(RazorPagesMovie.Models)”;
“數據上下文”中,選擇+(加號),在彈出的“添加數據上下文”對話框中,將自動生成具有正確命名空間的數據庫上下文類:RazorPagesMovie.Data.RazorPagesMovieContext。選擇“添加”
最后,選擇“添加”。
然后系統開始自動搭建基架:
上述步驟完成后,我們觀察‘解決方案資源管理器’中發生了如下變化:
① appsettings.json文件:增加了用於連接到本地數據庫的連接字符串
② Pages/Movies文件夾中,新增了5個文件(Create.cshtml、Delete.cshtml、Details.cshtml、Edit.cshtml、Index.cshtml),分別表示創建、刪除、詳細信息、編輯和索引
③ Data文件夾中,新增了1個文件:RazorPagesMovieContent.cs
④ Startup.cs文件中,更新了我們剛才新建的數據庫上下文RazorPagesMovieContext:
3、初始遷移
該部分,我們將學習使用程序包管理器控制台(PMC),它用於:
添加初始遷移、使用初始遷移來更新數據庫
① “工具”>“NuGet包管理器”>“程序包管理器控制台”:
② 將會默認在VS2019下方打開PMC窗口。
分別在控制台中輸入以下指令:
Add-Migration InitialCreate
Update-Database
其中:migration命令,可以生成用於創建初始數據庫架構的代碼。該架構基於在DbContent中指定的模型;
InitialCreate參數,用於為遷移命名。可以使用任何名稱。
Update命令,表示在尚未應用的遷移中運行Up方法。這種情況下,update在用於創建數據庫的Migrations/<time-stamp>_InitialCreate.cs文件中運行Up方法。
注意:這兩個命令會生成同樣的一個警告(其實是提示我們定義的模型類Movie中Price字段的屬性decimal是沒有指定的類型):
Microsoft.EntityFrameworkCore.Model.Validation[30000]
No type was specified for the decimal column 'Price' on entity type 'Movie'.…………
我們暫時忽略該警告。它將在后面的教程中得到修復。
③ 此時,觀察解決方案資源管理器,發現多了如下的內容:
4、最后檢查的工作,初始遷移后,檢查通過依賴關系注入注冊的上下文
ASP.NET Core 通過依賴關系注入進行生成。服務在程序啟動期間通過依賴關系注入進行注冊。需要這些服務的組件(比如這里的Razor頁面)通過構造函數提供相應的服務。
基架工具自動創建DB上下文並將其注冊到依賴關系注入容器。
① 檢查Startup.ConfigureServices方法,添加了以下代碼:
② /Data/RazorPagesMovieContext.cs文件為Movie模型協調EF Core 功能。它派生自Microsoft.EntityFramworkCore.DbContent。數據上下文指定數據模型中包含哪些實體:
上面的代碼,為實體集創建DbSet屬性。在實體框架術語中,實體集通常和數據表相對應,實體對應表中的行。
通過調用DBContentOptions對象中的一個方法將連接字符串名稱傳遞到上下文。本地開發時,ASP.NET Core配置系統在appsettings.json文件中讀取數據庫連接字符串。
5、測試
① 按下ctrl+F5,運行程序,並在地址欄中將/movies追加到原來的URL之后:
② 點擊“Create New”,在打開的添加電影記錄頁面中錄入新的記錄:
③ 可以對剛新加的電影,進行“Edit”、“Details”、“Delete”操作。
下一個文章中,我們將介紹本節中通過搭建基架生成的Razor頁面,並做一些UI的改動。