พื้นฐาน DbContext และ DbSet
ตั้งค่า DbContext กำหนดเอนทิตี กำหนดสตริงการเชื่อมต่อ และเรียกใช้คำสั่งสืบค้นแรก
พื้นฐาน DbContext และ DbSet เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
Entity Framework Core คืออะไร
EF Core คือเครื่องมือจับคู่ระหว่างอ็อบเจ็กต์กับฐานข้อมูลเชิงสัมพันธ์ (ORM) อย่างเป็นทางการของ .NET โดยจับคู่คลาส C# หรือเอนทิตีเข้ากับตารางฐานข้อมูล และช่วยให้คุณสืบค้นและบันทึกข้อมูลด้วย LINQ ได้ โดยไม่ต้องเขียน SQL สำหรับการดำเนินการส่วนใหญ่
การกำหนดเอนทิตี
เอนทิตีคือคลาส C# ธรรมดาที่มีคุณสมบัติจับคู่กับคอลัมน์ในฐานข้อมูล ตามข้อตกลง คุณสมบัติที่ชื่อ Id หรือ <TypeName>Id จะกลายเป็นคีย์หลัก
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public decimal Price { get; set; }
public int Stock { get; set; }
public DateTime CreatedAt { get; set; }
}การสร้าง DbContext
DbContext คือช่องทางเชื่อมต่อกับฐานข้อมูล โดยมีคุณสมบัติ DbSet<T> สำหรับแต่ละเอนทิตี และจัดการการเชื่อมต่อ การติดตามการเปลี่ยนแปลง และธุรกรรม
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options) { }
public DbSet<Product> Products => Set<Product>();
public DbSet<Order> Orders => Set<Order>();
}การลงทะเบียน DbContext ด้วย DI
เรียกใช้ AddDbContext ใน Program.cs เพื่อลงทะเบียนบริบทเป็นบริการที่มีขอบเขต และกำหนดค่าผู้ให้บริการฐานข้อมูล
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(
builder.Configuration.GetConnectionString("Default")));
// For SQLite (great for development/testing):
// options.UseSqlite("Data Source=app.db");การสอบถามพื้นฐานด้วย DbSet
DbSet<T> เปิดให้ใช้ตัวดำเนินการของ LINQ ได้ การสอบถามจะยังไม่ทำงานจนกว่าจะมีการแจกแจงผลลัพธ์ (await ...ToListAsync()) ซึ่งเรียกว่า การประมวลผลแบบเลื่อนเวลา
public class ProductService
{
private readonly AppDbContext _db;
public ProductService(AppDbContext db) => _db = db;
public async Task<List<Product>> GetExpensiveAsync(decimal minPrice)
{
return await _db.Products
.Where(p => p.Price >= minPrice)
.OrderBy(p => p.Name)
.ToListAsync();
}
}การค้นหาด้วยคีย์หลัก
FindAsync จะตรวจสอบแคชตัวติดตามการเปลี่ยนแปลงภายในก่อนติดต่อฐานข้อมูล ใช้เมธอดนี้เมื่อสอบถามด้วยคีย์หลัก เพื่อหลีกเลี่ยงการส่งคำขอไปกลับฐานข้อมูลที่ซ้ำซ้อน
var product = await _db.Products.FindAsync(42);
if (product is null)
throw new KeyNotFoundException("Product not found");
// For complex keys, pass all key values:
var orderLine = await _db.OrderLines.FindAsync(orderId, productId);การเพิ่มระเบียนใหม่
เรียกใช้ Add เพื่อจัดคิวเอนทิตีสำหรับการแทรก จากนั้นเรียกใช้ SaveChangesAsync เพื่อยืนยันการเปลี่ยนแปลง EF Core จะสร้างคำสั่ง INSERT ของ SQL และเติมค่า Id ที่สร้างขึ้นโดยอัตโนมัติ
var product = new Product
{
Name = "Mechanical Keyboard",
Price = 149.99m,
Stock = 50,
CreatedAt = DateTime.UtcNow
};
_db.Products.Add(product);
await _db.SaveChangesAsync();
Console.WriteLine(product.Id); // Auto-generated PKการอัปเดตระเบียน
เอนทิตีที่โหลดโดย EF Core จะได้รับการติดตาม คุณสามารถแก้ไขพร็อพเพอร์ตีได้โดยตรง แล้วเรียกใช้ SaveChangesAsync — EF Core จะตรวจพบการเปลี่ยนแปลงและสร้างคำสั่ง UPDATE ที่ได้รับการปรับให้เหมาะสม
var product = await _db.Products.FindAsync(42);
if (product is not null)
{
product.Price = 129.99m;
product.Stock -= 1;
await _db.SaveChangesAsync(); // UPDATE Products SET Price=...
}การลบระเบียน
เรียกใช้ Remove เพื่อทำเครื่องหมายเอนทิตีสำหรับการลบ จากนั้นเรียกใช้ SaveChangesAsync สำหรับการลบจำนวนมากโดยไม่ต้องโหลดเอนทิตี ให้ใช้ ExecuteDeleteAsync (.NET 7+)
// Delete a tracked entity
_db.Products.Remove(product);
await _db.SaveChangesAsync();
// Bulk delete without loading (EF Core 7+)
await _db.Products
.Where(p => p.Stock == 0)
.ExecuteDeleteAsync();การกำหนดค่าด้วย Fluent API
เขียนทับ OnModelCreating เพื่อกำหนดค่าเอนทิตีโดยใช้ Fluent API เช่น ชื่อตาราง ชนิดคอลัมน์ ข้อจำกัด ดัชนี และความสัมพันธ์
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>(entity =>
{
entity.ToTable("products");
entity.Property(p => p.Name).IsRequired().HasMaxLength(200);
entity.Property(p => p.Price).HasColumnType("decimal(18,2)");
entity.HasIndex(p => p.Name);
});
}กรณีใช้งานจริง: Repository ที่ใช้ DbContext
Repository ทั่วไปจะห่อหุ้ม DbContext เพื่อรวมตรรกะการเข้าถึงข้อมูลไว้ที่ศูนย์กลาง และแยกรายละเอียดการสอบถามออกจากคลาสบริการ
public class ProductRepository : IProductRepository
{
private readonly AppDbContext _db;
public ProductRepository(AppDbContext db) => _db = db;
public async Task<Product?> GetByIdAsync(int id)
=> await _db.Products.AsNoTracking().FirstOrDefaultAsync(p => p.Id == id);
public async Task<List<Product>> SearchAsync(string query)
=> await _db.Products
.Where(p => p.Name.Contains(query))
.AsNoTracking()
.ToListAsync();
}ตรวจสอบความเข้าใจ
AsNoTracking() ทำอะไรเมื่อสอบถามข้อมูลด้วย EF Core
ทบทวน: พื้นฐาน DbContext และ DbSet
ประเด็นสำคัญ:
- DbContext คือเซสชันที่เชื่อมต่อกับฐานข้อมูล ส่วน DbSet<T> แทนตารางหนึ่งตาราง
- ลงทะเบียนด้วย
AddDbContextใน DI โดยค่าเริ่มต้นจะเป็นบริการที่มีขอบเขต - การสอบถามด้วย LINQ จะประมวลผลแบบเลื่อนเวลา — เรียกใช้ด้วย
ToListAsyncหรือFirstOrDefaultAsync - การติดตามการเปลี่ยนแปลงช่วยให้ดำเนินการ UPDATE/DELETE โดยอัตโนมัติผ่าน SaveChangesAsync
- ใช้
AsNoTracking()กับการสอบถามแบบอ่านอย่างเดียวเพื่อเพิ่มประสิทธิภาพ
คำถามที่พบบ่อย
บทเรียน “พื้นฐาน DbContext และ DbSet” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐาน DbContext และ DbSet” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐาน DbContext และ DbSet”
ตั้งค่า DbContext กำหนดเอนทิตี กำหนดสตริงการเชื่อมต่อ และเรียกใช้คำสั่งสืบค้นแรก คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐาน DbContext และ DbSet” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐาน DbContext และ DbSet
- การย้ายข้อมูลและการจัดการสคีมา
- การดำเนินการ CRUD ด้วย EF Core
- ความสัมพันธ์: หนึ่งต่อหลายและหลายต่อหลาย