1️⃣ Microsoft.EntityFrameworkCore.InMemory คืออะไร

By suparat · 08 Oct 2025


โอเค 😎 เรามาเจาะลึก 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️⃣ ข้อจำกัด

  1. ไม่รองรับ SQL-specific features (เช่น Stored Procedure, Transaction)

  2. ข้อมูล ไม่ถูกเก็บถาวร

  3. การ 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 ให้คุณดูแบบครบ ๆ โค้ดจริง 😎

คุณอยากให้ผมทำไหม?

1️⃣ Microsoft.EntityFrameworkCore.InMemory คืออะไร
Web hosting by Somee.com