iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 24
0
Modern Web

ASP.NET Core 入門實戰30天系列 第 24

Day 24 使用ASP .NET Core 手把手打造一個購物網站 - 使用EF Core 異動欄位

前言

今天來記錄一下在EF Core使用sqllite
如果要異動資料表內容要怎麼處理

問題

先前在DBContext命名的Product Table
要rename成Products
因為產品可能是多個,複數會比較合理
另外就是需要異動欄位時,要如何操作


使用EF Core 異動資料表

正規的方式

假設今天Model有異動
基本上修改Model裡面的.cs,在DBcontext更新
新增一個migration
接著update資料庫就可以了

舉例假設今天要新增一個photo的欄位
首先只要先將新增Modle裡面的參數

因為這個只是新增欄位,所以DBContext裡面的不需要調整
如果要加入seed data也可以在這邊一起修改

新增migration

 dotnet ef migrations add [updateMigration]

異動DB

dotnet ef database update

一般來說只要修改好model還有相關用到的欄位
新增一個migrations,接著update DB就可以了

sqllite的問題

實際在測試時發現
sqllite只要有異動到DB的內容
rename 欄位或是table name時
產出來的migration會有一段drop的code
執行update DB會報錯

修改table名稱時

修改欄位名稱

查了一下原因
發現在sqllite不支援
如果使用sqlServer應該是不會有這個狀況

針對這個問題有兩個解決方式

  1. 砍掉資料庫重新migration
    這個應該就是大絕招了吧
    如果專案只是在初期或許還堪用
    但缺點就是需要備份DB的資料,不然DB的資料就drop掉了
    除非不需要DB的資料或是一開始建置的期間,這個或許是一個方法
    但整體來說不太建議這麼處理
    • 刪除專案中DB檔
      在專案下可以找到副檔名.db的檔案
      將它刪除

    • remove migration
      執行remove migrations 移除前面的migrations

      dotnet ef migrations remove
      
    • 新增migration
      建立一個新的migrations

       dotnet ef migrations add [updateMigration]
      
    • 更新DB

      dotnet ef database update
      
  2. 修改migrations檔案,使用sql語法更新
    這個是比較好的作法
    • 修改migrations檔案
      使用migrationBuilder.Sql()方法
      直接輸入sql語法

    • 更新DB

       dotnet ef database update
    
    • 執行畫面

參考資料:
https://www.entityframeworktutorial.net/efcore/entity-framework-core-migration.aspx

https://github.com/dotnet/AspNetCore.Docs/issues/11268

https://t-heiten.net/ef-core/fix-sqlite-migration/


上一篇
Day 23 使用ASP .NET Core 手把手打造一個購物網站 - 新增Repository
下一篇
Day 25 使用ASP .NET Core 手把手打造一個購物網站 - Create & Read
系列文
ASP.NET Core 入門實戰30天30

尚未有邦友留言

立即登入留言