雖然這次不會用到,但想要稍微講一下ASP.NET Core的ORM,Entity Framework Core
故事1
有一名警衛,他看守著三道門,那這幾個門各自對應一把鑰匙,總共三把鑰匙,但他每次巡邏的時候,都覺得掏對鑰匙很麻煩,所以他就許願,有一個開門機器,說要開哪個門就開哪個門,機器會自己對照到那個門對應的鑰,他指定哪個門就好
故事2
小明今天很開心的開發完後端,寫了許多SQL處理資料庫的行為,需求完成了,可是PM突然說,他不想要用MSSQL,想要換到PostgreSQL,可憐的小明晚上留下來加班,要把語法都改過來,這時候他就想,如果可以開外掛,自動處理語法切換就好了
物件關聯對應(Object-Relational Mapping),用來將資料庫中的資料表(Relational)與程式中的物件(Object)做對應,開發者可以用物件導向的方式(如類別與屬性)來操作資料庫,而不需要寫 SQL 語句。
當然,既然是通用,可以預期功能相對比較籠統,如果要針對特定資料庫更精細的做法,也可能會有需要手動寫的時候,但已經大大的減少,切換資料庫帶來的大量修改
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
public class CatalogContext : DbContext
{
public CatalogContext(DbContextOptions<CatalogContext> options) : base(options)
{
}
public DbSet<CatalogItem> CatalogItems { get; set; }
public DbSet<CatalogBrand> CatalogBrands { get; set; }
public DbSet<CatalogType> CatalogTypes { get; set; }
}
builder.Services.AddDbContext<CatalogContext>(
options => options.UseSqlServer(
builder.Configuration.GetConnectionString("DefaultConnection")));
SELECT
Id AS Value,
Name AS Text
FROM
CatalogBrands
WHERE
Enabled = 1
ORDER BY
Name ASC;
使用ORM的話
var brandItems = await _context.CatalogBrands
.Where(b => b.Enabled) // 篩選Enabled = true
.OrderBy(b => b.Name) // 依 Name 由小到大排序
.Select(b => new SelectListItem { // 只取 Id、Name
Value = b.Id,
Text = b.Name
})
.ToListAsync(); // 非同步取得結果清單
Working with Data in ASP.NET Core Apps
我覺得快速初步了解某樣知識是好的,但什麼都想速成,不去實際踩雷犯錯是不可能的,在追捧輕鬆獲益的時代,好像埋頭苦幹的人都是傻子,相比之下,我果然還是更喜歡匠人精神,像史特拉帝瓦理琴那樣