การย้ายข้อมูลและการจัดการสคีมา
สร้าง ใช้งาน และย้อนกลับการย้ายข้อมูล เพื่อพัฒนาสคีมาฐานข้อมูลอย่างปลอดภัย
การย้ายข้อมูลและการจัดการสคีมา เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
EF Core Migrations คืออะไร
Migrations คือไฟล์ที่สร้างจากโค้ดเพื่ออธิบายการเปลี่ยนแปลงโครงสร้างฐานข้อมูลทีละขั้น แทนที่จะเขียน DDL SQL ด้วยตนเอง EF Core จะสร้างและนำการเปลี่ยนแปลงไปใช้โดยอัตโนมัติ ทำให้โค้ดและฐานข้อมูลสอดคล้องกัน
การติดตั้งเครื่องมือ EF Core
ต้องติดตั้งเครื่องมือ EF Core CLI (dotnet-ef) ในระดับระบบ หรือเป็นเครื่องมือภายในโครงการ เพื่อเรียกใช้คำสั่ง migration จากเทอร์มินัล
# Install globally
dotnet tool install --global dotnet-ef
# Verify
dotnet ef --version
# Required NuGet packages in your project:
# Microsoft.EntityFrameworkCore.Design
# Microsoft.EntityFrameworkCore.SqlServer (or Sqlite, etc.)การสร้าง Migration แรก
dotnet ef migrations add จะเปรียบเทียบโมเดลปัจจุบันกับภาพสถานะล่าสุด แล้วสร้างไฟล์ migration ที่มีเมธอด Up() (นำไปใช้) และ Down() (ย้อนกลับ)
# Create initial migration
dotnet ef migrations add InitialCreate
# Output files created:
# Migrations/20240101_InitialCreate.cs <- Up/Down
# Migrations/20240101_InitialCreate.Designer.cs
# Migrations/AppDbContextModelSnapshot.cs <- current modelภายในไฟล์ Migration
Migration แต่ละรายการมีเมธอด Up (นำการเปลี่ยนแปลงไปใช้) และเมธอด Down (ย้อนการเปลี่ยนแปลง) โดย EF Core จะสร้างเมธอดเหล่านี้โดยอัตโนมัติจากความแตกต่างของโมเดล
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Products",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(maxLength: 200, nullable: false),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table => table.PrimaryKey("PK_Products", x => x.Id));
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(name: "Products");
}
}การนำ Migrations ไปใช้
dotnet ef database update จะนำ Migrations ที่ยังค้างอยู่ทั้งหมดไปใช้ EF Core จะติดตามว่า Migrations ใดทำงานแล้วในตาราง __EFMigrationsHistory
# Apply all pending migrations
dotnet ef database update
# Apply up to a specific migration
dotnet ef database update AddProductIndex
# Roll back to a previous migration
dotnet ef database update InitialCreateการทำ Migration ด้วยโค้ดเมื่อเริ่มต้นระบบ
ในระบบจริง คุณสามารถนำ Migrations ไปใช้ด้วยโค้ดเมื่อเริ่มต้นระบบได้ เพื่อให้ฐานข้อมูลเป็นปัจจุบันอยู่เสมอโดยไม่ต้องดำเนินการ CLI ด้วยตนเอง
var app = builder.Build();
// Apply pending migrations at startup
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await db.Database.MigrateAsync();
}
app.Run();การเพิ่มคอลัมน์ใน Migration ใหม่
เพิ่มพร็อพเพอร์ตีให้กับเอนทิตี จากนั้นสร้าง Migration ใหม่ EF Core จะตรวจพบการเปลี่ยนแปลงและสร้างการดำเนินการ AddColumn
// 1. Add property to entity
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public decimal Price { get; set; }
public string? Description { get; set; } // NEW
}
// 2. Generate migration
// dotnet ef migrations add AddProductDescription
// Generated Up():
migrationBuilder.AddColumn<string>(
name: "Description",
table: "Products",
nullable: true);การเติมข้อมูลใน Migrations
ใช้ HasData ใน OnModelCreating เพื่อเติมข้อมูลอ้างอิง EF Core จะรวมข้อมูลดังกล่าวไว้ใน Up ของ Migration ในรูปแบบคำสั่ง INSERT
modelBuilder.Entity<Category>().HasData(
new Category { Id = 1, Name = "Electronics" },
new Category { Id = 2, Name = "Books" },
new Category { Id = 3, Name = "Clothing" }
);
// Then regenerate the migration:
// dotnet ef migrations add SeedCategoriesSQL แบบกำหนดเองใน Migrations
เมื่อคุณต้องใช้ DDL ที่ EF Core ไม่สามารถสร้างโดยอัตโนมัติได้ เช่น ทริกเกอร์ วิว หรือโพรซีเดอร์ที่เก็บไว้ ให้ใช้ migrationBuilder.Sql()
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"
CREATE VIEW vw_ActiveProducts AS
SELECT Id, Name, Price
FROM Products
WHERE IsActive = 1
");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("DROP VIEW vw_ActiveProducts");
}การนำ Migration ออก
หากคุณยังไม่ได้นำ Migration ไปใช้ คุณสามารถลบออกได้ด้วย dotnet ef migrations remove วิธีนี้ใช้ได้เฉพาะกับ Migration ล่าสุดเท่านั้น
# Remove the last unapplied migration
dotnet ef migrations remove
# List all migrations and their status
dotnet ef migrations list
# Script all migrations to SQL (for DBA review)
dotnet ef migrations script --output deploy.sqlกรณีใช้งานจริง: กลยุทธ์ Migration สำหรับ CI/CD
ในกระบวนการ CI/CD ให้สร้างสคริปต์ Migration แล้วให้ DBA ตรวจสอบก่อนนำไปใช้ในระบบจริง — อย่าเรียกใช้ MigrateAsync() โดยไม่ตรวจสอบในระบบจริงที่มีความสำคัญ
# Generate idempotent script for all pending migrations
dotnet ef migrations script --idempotent --output migrations.sql
# Review migrations.sql, then apply via sqlcmd / psql:
# sqlcmd -S server -d db -i migrations.sqlตรวจสอบความเข้าใจ
ตารางใดของ EF Core ที่ติดตามว่า Migrations ใดถูกนำไปใช้กับฐานข้อมูลแล้ว
ทบทวน: Migrations และการจัดการโครงสร้างฐานข้อมูล
ประเด็นสำคัญ:
dotnet ef migrations add <Name>จะสร้างไฟล์การเปลี่ยนแปลงโครงสร้างฐานข้อมูลทีละขั้น- Migration แต่ละรายการมีเมธอด
Up()(นำไปใช้) และDown()(ย้อนกลับ) dotnet ef database updateจะนำ Migrations ที่ยังค้างอยู่ไปใช้- ใช้
MigrateAsync()เมื่อแอปเริ่มต้นระบบเพื่อทำให้การนำระบบไปใช้งานเป็นอัตโนมัติ - สร้างสคริปต์ SQL แบบทำซ้ำได้โดยไม่ทำให้ผลลัพธ์เปลี่ยนแปลง เพื่อให้ DBA ตรวจสอบในกระบวนการนำระบบจริงไปใช้งาน
คำถามที่พบบ่อย
บทเรียน “การย้ายข้อมูลและการจัดการสคีมา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การย้ายข้อมูลและการจัดการสคีมา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การย้ายข้อมูลและการจัดการสคีมา”
สร้าง ใช้งาน และย้อนกลับการย้ายข้อมูล เพื่อพัฒนาสคีมาฐานข้อมูลอย่างปลอดภัย คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การย้ายข้อมูลและการจัดการสคีมา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน DbContext และ DbSet
- การย้ายข้อมูลและการจัดการสคีมา
- การดำเนินการ CRUD ด้วย EF Core
- ความสัมพันธ์: หนึ่งต่อหลายและหลายต่อหลาย