0Pricing
C# Academy · บทเรียน

การย้ายข้อมูลและการจัดการสคีมา

สร้าง ใช้งาน และย้อนกลับการย้ายข้อมูล เพื่อพัฒนาสคีมาฐานข้อมูลอย่างปลอดภัย

การย้ายข้อมูลและการจัดการสคีมา เป็นบทเรียน 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 SeedCategories

SQL แบบกำหนดเองใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน DbContext และ DbSet
  2. การย้ายข้อมูลและการจัดการสคีมา
  3. การดำเนินการ CRUD ด้วย EF Core
  4. ความสัมพันธ์: หนึ่งต่อหลายและหลายต่อหลาย
← กลับไปที่ C# Academy