โอเค 😎 เรามาเจาะลึก Microsoft.EntityFrameworkCore.InMemory
กันแบบเข้าใจง่าย ๆ
1️⃣ Microsoft.EntityFrameworkCore.InMemory คืออะไร
-
เป็น In-Memory Database Provider ของ EF Core
-
ข้อมูลจะถูกเก็บใน หน่วยความจำ ชั่วคราว ไม่ต้องใช้ SQL Server หรือ Database จริง
-
เหมาะสำหรับ:
-
Unit Testing
-
การพัฒนา Prototype / PoC
-
-
ข้อดี: ไม่ต้องตั้งค่า Database จริง, รวดเร็ว, ไม่ต้อง cleanup
⚠️ ข้อมูลจะหายเมื่อปิดโปรแกรม เพราะไม่ได้เก็บจริงใน disk
2️⃣ การติดตั้ง
ใช้ NuGet Package:
dotnet add package Microsoft.EntityFrameworkCore.InMemory
3️⃣ การใช้งานกับ DbContext
ตัวอย่าง DbContext และ Entity
using Microsoft.EntityFrameworkCore;
// Entity
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
// DbContext
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Product> Products { get; set; }
}
4️⃣ การตั้งค่า InMemory Database
สำหรับ Console / Unit Test
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseInMemoryDatabase(databaseName: "TestDb")
.Options;
using var context = new AppDbContext(options);
สำหรับ ASP.NET Core Web API (Dependency Injection)
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("TestDb"));
services.AddControllers();
}
5️⃣ ตัวอย่าง CRUD
Create (เพิ่มข้อมูล)
context.Products.Add(new Product { Name = "Laptop", Price = 25000 });
context.SaveChanges();
Read (ดึงข้อมูล)
var products = context.Products.ToList();
Update (แก้ไขข้อมูล)
var product = context.Products.First();
product.Price = 26000;
context.SaveChanges();
Delete (ลบข้อมูล)
var product = context.Products.First();
context.Products.Remove(product);
context.SaveChanges();
6️⃣ Unit Test ตัวอย่าง
using Xunit;
public class ProductTests
{
[Fact]
public void CanAddProduct()
{
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseInMemoryDatabase("TestDb")
.Options;
using var context = new AppDbContext(options);
context.Products.Add(new Product { Name = "Mouse", Price = 500 });
context.SaveChanges();
Assert.Equal(1, context.Products.Count());
}
}
-
✅ เหมาะสำหรับ การทดสอบ CRUD โดยไม่กระทบ Database จริง
7️⃣ ข้อจำกัด
-
ไม่รองรับ SQL-specific features (เช่น Stored Procedure, Transaction)
-
ข้อมูล ไม่ถูกเก็บถาวร
-
การ query บางอย่างอาจไม่เหมือน Database จริง → สำหรับ Unit Test / Prototype เท่านั้น
💡 สรุป:Microsoft.EntityFrameworkCore.InMemory
เป็นตัวช่วยสำหรับ Unit Test / Prototype ทำให้ไม่ต้องตั้ง Database จริง, รวดเร็ว, ใช้ง่าย และใช้งานร่วมกับ EF Core ได้เหมือน Database จริง แต่ข้อมูลหายเมื่อปิดโปรแกรม
ถ้าคุณอยาก ผมสามารถทำ ตัวอย่าง Web API ASP.NET Core + EF Core InMemory CRUD พร้อม Unit Test ให้คุณดูแบบครบ ๆ โค้ดจริง 😎
คุณอยากให้ผมทำไหม?