建立書本的範例,書本使用的是Asp.Net Core 2.2版本,但考量實際專案改使用Asp.Net Core 3.1版本,然後自然會開始遇到一連串狀況了。目前的進度只到使用EF Core自動建立資料庫與資料表,後續的新增、修改、刪除、查詢功能都還沒開始處理,先記錄目前為止的問題。
- EF Core需要安裝:
之後在同事的建議下,安裝了5.04版,這邊特別說明6.01需要.NET Core 6以上版本才能安裝,我目前的版本裝不了。
安裝之後我開始依照範例處理DTO、資料庫連線設定等等,然後問題出現了,在Startup.cs的ConfigureServices中加入SQL服務時Error了,原因是找不到我使用的函式,如下圖:
安裝EF Core的SqlServer相關套件 |
安裝版本基本是跟EF Core的版本,安裝完剛剛在Startup.cs的錯誤就沒問題了。
接著我按照書上的說明,準備使用Code First方式,通過Migration建立資料庫與資料表。
首先要先找到使用指令的地方,工具/NuGet事件管理員/套件管理器主控台,順道一提因為書籍是簡體版,兩邊翻譯的不同,這個位置讓我找了很久。
接著下達命令來建置Migration參考檔案,命令如下:
Add-Migration InitalCreation然後當然又錯誤了(實際的錯誤訊息忘了,這是我將參考拿掉產生的)。
命令錯誤資訊 |
查了一陣子,發現又少裝一個套件,EF Core Tools。
安裝EF Core的Tools相關套件 |
緊接著,執行Add Migration沒有問題成功了,得到一個Migrations的資料夾,裡面設定了資料庫與資料表的建置方式。
於是依照範例繼續準備寫入資料庫中,命令如下:
Update-Database
然後又錯誤了,原來的錯誤訊息好像是和Initial Catalog相關,因為已經無法重現原來的問題,講一下印象中大意是說不可使用Initial Catalog字元,或者使用Initial Catalog有問題之類的。
這個錯誤大概是我找最久的,我當時不再公司只能自己尋找問題,偏偏對這個不熟悉找到的資訊也大多有問題,沒有人幫忙的情況下,最終才發現錯誤訊息的問題跟我考慮和尋找的方向有落差。
原因是我資料庫連線設定錯誤,把設定值放上來。
"DefaultConnection": "Data Source=localhost\\資料庫連線;Initial Catalog=資料庫名稱;Integrated Security=SSPI"
這是我從各式各樣的網頁找的答案拼湊出來的,這個設定值並不是給我目前的狀況使用,但範例原先的設定讓我新增成功卻找不到新增的資料庫,總之結論我把正確的設定值貼上。
"DefaultConnection": "server=localhost\\資料庫連線;database=資料庫名稱;Integrated Security=SSPI"
到此為止終於新增成功,且在資料庫連線工具中找到新增的資料庫了,可喜可賀。
繼續補充之後Migration自動建立假資料的動作
在連線設定繼承DbContext的物件中複寫OnModelCreating函式
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<AuthorDBDto>().HasData(List<AuthorDBDto>authors);
modelBuilder.Entity<BookDBDto>().HasData(List<AuthorDBDto>books);
}
工具/NuGet事件管理員/套件管理器主控台
在此輸入指令 Add-Migration SeedData,在Migration資料夾中會多出SeedData的檔案,內容是List中想要新增的資料。然後在輸入指令Update-Database,將資料新增到資料庫中。如下圖:
要注意的是Add-Migration SeedData之後即便把SeedData檔案刪除,仍然已經將資料寫入某個地方,重新填寫資料時,剛剛已經寫入的資料不會寫入新的SeedData檔案。
接著測試自動刪除檔案,先輸入指令Add-Migration RemoveSeededData,在Migration資料夾中會多出RemoveSeededData的檔案,內容是剛剛新增的資料。然後在輸入指令Update-Database,將資料從資料庫中刪除。如下圖:
到此EF Core的測試完畢,真是太好了。