在學習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();
}
把專案跑起來,就能看到剛剛塞的測資了
塞測資那部分未來如果資料量大、程式變複雜的話,可以考慮抽出來另外寫
參考資料: