使用EF Core InMemory Provider

在學習ASP.NET Core基本CRUD的過程中暫時不打算另外弄一個DB,因此先讓EF Core使用InMemory Provider。未來在測試時也可以改用InMemory Provider,塞入預先準備好的資料給unit test使用。

先到nuget安裝Microsoft.EntityFrameworkCore.InMemory套件

https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.InMemory/ 

將Startup.cs中AddDbContext設定改為UseInMemoryDatabase,並為DB命名

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    //services.AddDbContext<TodoListContext>(options =>
    //        options.UseSqlServer(Configuration.GetConnectionString("TodoListContext")));

    services.AddDbContext<TodoListContext>(options =>
            options.UseInMemoryDatabase("TodoListDB"));
}

這樣就完成了

但將資料放在記憶體,每次重新啟動專案後上次塞的資料都會消失

因此可以先在程式裡預塞一些資料進去

在Program.cs中,預設IHostBuilder在執行完Build後就接著執行Run

public static void Main(string[] args)
{
    CreateHostBuilder(args).Build().Run();
}

先將Build跟Run拆開,中間準備用來寫塞測資的code

public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    //塞測資            

    host.Run();
}

塞資料

using(var scope = host.Services.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<TodoListContext>();

    context.TodoModel.AddRange(
        new TodoModel
        {
            Id = 1,
            Title = "保養汽車",
            Description = "換機油",
            CreateDate = DateTime.Now,
            ModifyDate = DateTime.Now
        },
        new TodoModel
        {
            Id = 2,
            Title = "準備晚餐",
            Description = "豬排、燙青菜",
            CreateDate = DateTime.Now,
            ModifyDate = DateTime.Now
        });

    context.SaveChanges();
}

把專案跑起來,就能看到剛剛塞的測資了

塞測資那部分未來如果資料量大、程式變複雜的話,可以考慮抽出來另外寫

參考資料: