參照官方教學
這邊使用 Entity Framework Core 的 Code First Migrations 來操作資料庫
包含建立資料庫、新增修改刪除表(這邊是可以進版退版的),Insert Seed Data…等等。
首先要先打開終端機到 Acme.BookStore.EntityFrameworkCore.DbMigrations 目錄
然後執行命令 dotnet ef migrations add Created_Book_Entity 建立資料庫版本
執行成功會跑出 migrations 資料夾
裡面會定義要新增表,還是修改裡面甚麼欄位,或是移除某某東西之類的,這也可以生出SQL指令,有興趣可以去看MSDN
No. 4.5 SeedData
到這邊其實可以去執行Acme.BookStore.DbMigrator 或 PM> dotnet ef update database 就可以產生資料庫跟表了
不過這邊先進行 SeedData 相關作業來說明如何建立初始資料,這有利於初次部屬或進行單元測試,如果沒有需求可以看看先,說不定哪天會用得上
這邊 SeedData 是定義在 Domain 層
然後他必須繼承 IDataSeedContributor
類別名稱預設是 BookStoreDataSeederContributor
但這東西樣板專案裡面沒有所以需要自己手動新增
namespace Acme.BookStore
{
public class BookStoreDataSeederContributor
: IDataSeedContributor, ITransientDependency
{
private readonly IRepository<Book, Guid> _bookRepository;
public BookStoreDataSeederContributor(IRepository<Book, Guid> bookRepository)
{
_bookRepository = bookRepository;
}
public async Task SeedAsync(DataSeedContext context)
{
if (await _bookRepository.GetCountAsync() <= 0)
{
await _bookRepository.InsertAsync(
new Book
{
Name = "1984",
Type = BookType.Dystopia,
PublishDate = new DateTime(1949, 6, 8),
Price = 19.84f
},
autoSave: true
);
await _bookRepository.InsertAsync(
new Book
{
Name = "The Hitchhiker's Guide to the Galaxy",
Type = BookType.ScienceFiction,
PublishDate = new DateTime(1995, 9, 27),
Price = 42.0f
},
autoSave: true
);
}
}
}
}
這邊如果你要拿上一個新增的 Id 去當下一個新增的某欄位值,自己 var 變數去接 Insert 回傳的實體,下面就可以用 entity.Id 當作 value
最後執行 Acme.BookStore.DbMigrator 這專案就會用 appsetting 裡面的連線字串去建立資料庫與資料表並匯入 SeedData
預設是 localdb 裝 vs 預設會有的 db ,沒有了話自己改連線字串到開發用的db,這邊就不多做解釋了