此文章主要說明使用Enity Framework Code First 開發, 異動資料庫時的步驟及注意事項
[大綱]
- Install EntityFramework
- CodeFirst /Model First/Database First 如何選擇
- 啟用Migration/新增Migration
指令:
Enable-Migrations
Add-Migration - 更新資料庫 及產生異動相關Sql Script
指令:
Update-Database - 回復到初始狀態
- 參考
- install EntityFramework
安裝EntityFramework
PM>Install-Package entityframework- Code First/Model First/Database First ?
如何選擇這些開發方式呢?:參考[4] 是開始動手之前要先考慮的重要課題
Code First: New ADO.NET Entity Data Model /EF Wizard/Empty Code First Model
適用於:1.已經有Domain Class 或是 還沒建立資料庫 ,想先開始寫Domain Class再產生資料庫的專案適用
2. 對資料庫有高度權限及設計主導權,或較不複雜的系統,需要快速開發者適用
3. Code First對開發者兼任系統設計或分析師的開發團隊是很適用
反之則不然,開發者對資料庫及系統設計若沒有太大的主導權,應該會受到很多限制
參考[1]
Database First:New ADO.NET Entity Data Model /EF Wizard/EF Designer From Database
適用於: 已經有資料庫schema,想使用EF 協助產生與DB Table對應的Class
參考[2]
Model First:New ADO.NET Entity Data Model /EF Wizard/Empty EF Desinger model
適用於:還沒有資料庫Schema,但想用EF Designer 來設計Model
參考[3]
- Code First/Model First/Database First ?
- Code First
- 建立實體Table 相關 class
- e.g
Users
Roles - 建立Context Class
public class SystemContext : DbContext { public DbSet<User> Users { get; set; } public DbSet<Role> Roles { get; set; } public SystemContext() : base("name=DBConnection") { } }
- e.g
- 建立實體Table 相關 class
- 啟用Migration/新增Migration
e.g
Nuget Package Manager
1.PM>Enable-Migrations -EnableAutomaticMigrations -Force -AutomaticMigrationDataLossAllowed
啟用後-->會自動新增設定DbContext參數 於 /Migrations/Configurations.cs
2.PM>Add-Migration firstinit #firstinit 為migration name #版本:1
3.開發,修改欄位(修改Role.ID為int)
4.PM>Add-Migration secondMigration #版本:2
5.開發,修改欄位(修改Role.CreateUser為varchar)
6.PM>Add-Migration thirdMigration #版本:3
- 異動資料庫&產生異動相關Sql Script
PM>update-database -verbose
-verbose 會顯示sql script
- 產生不同migration版本間,所需要的異動SQL Script
- 產生最近一次差異的SQL(預設)
PM>Update-Database -Script - 產生重初始化(0) 到第(2)版所有SQL 語法 (e.g Create All Table)
PM>Update-Database -Script -SourceMigration: $InitialDatabase -TargetMigration: secondMigration
內部語法中會判斷,是否該版本要執行alter or create - 產生差異Sql (1)到(2)版的差異SQL(e.g Alter Table)
PM>Update-Database -Script -SourceMigration: firstinit -TargetMigration: secondMigration - 產生差異Sql (2)到(3)版的差異SQL(e.g drop column)
PM>Update-Database -Script -SourceMigration: firstinit -TargetMigration: thirdMigration - 更多update-database相關指令
PM>get-help update-database
- 產生最近一次差異的SQL(預設)
- 回復到初始狀態
PM>Update-Database -TargetMigration: $InitialDatabase -force
需下-force 才會允許資料遺失或是於Configuration.cs中AutomaticMigrationDataLossAllowedpublic Configuration() { AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; }
- 參考
1.Code First:
http://www.entityframeworktutorial.net/code-first/entity-framework-code-first.aspx
2.Database First
http://www.entityframeworktutorial.net/database-first-with-entity-framework.aspx
3.Model First:
http://www.entityframeworktutorial.net/model-first-with-entity-framework.aspx
4.如何選擇Code First/Database First/Model First
http://www.entityframeworktutorial.net/choosing-development-approach-with-entity-framework.aspx