目的

說明EFCore基本語法,EFCore的基礎為Linq,所以使用上與Linq邏輯一模一樣,只是語法有些微差異。

建立新專案

選擇ASP.NET Core Web API專案範本,並執行下一步 步驟1

設定新的專案

命名你的專案名稱,並選擇專案要存放的位置。 步驟2

其他資訊

直接進行下一步 步驟3

NuGet加入套件

  • Microsoft.EntityFrameworkCore.Sqlite
  • Microsoft.EntityFrameworkCore.Design

步驟4

新增Student.cs類別檔

新增Models資料夾,並在裡面新增Student.cs類別檔 範例5-1

編輯Student.cs類別檔

  public class Student {
    public int Id { get; set; }
    public string Name { get; set; } = "BillHuang";
    public int Age { get; set; }
  }

範例6-1

新增EFCoreContext.cs類別檔

新增DBContext資料夾,並在裡面新增EFCoreContext.cs類別檔 範例7-1

編輯EFCoreContext.cs類別檔

//別忘了using
using Microsoft.EntityFrameworkCore;
using EFCoreExample_Advanced.Models;

namespace EFCoreExample_Advanced.DBContext {
  //繼承DbContext
  public class EFCoreContext : DbContext {
    //複寫OnConfiguring
    protected override void OnConfiguring(DbContextOptionsBuilder options) {
      //指定連線字串,連到SQLite
      options.UseSqlite("Data Source=Student.sqlite");
    }
    //設定student資料表
    public DbSet<Student> Students { get; set; }
  }
}

範例8-1

編輯Program.cs檔

//別忘了using
using EFCoreExample_Advanced.DBContext;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
//註冊EFCoreContext
builder.Services.AddDbContext<EFCoreContext>();
//下面省略

範例9-1

到套件管理器主控台下Terminal指令

檢視>其他視窗>套件管理器主控台 範例10-1 下方會出現命令列 範例10-2 輸入dir會顯示目錄檔案及子目錄清單 範例10-3 輸入cd EFCoreExample_Advanced移動到專案檔底下後再輸入dir確認是否到正確路徑 範例10-4 輸入dotnet tool install --global dotnet-ef在全域安裝EFCore CLI工具(如果已經安裝,會出現下圖訊息,即可忽略此步驟) 範例10-5 輸入dotnet ef migrations add CreateInitial初始化SQLite 範例10-6 輸入dotnet ef database update更新SQLite資料表 範例10-7 成功就會自動產生Migrations資料夾 範例10-8

編輯WeatherForecastController檔案編輯

  • 寫新的對外API:QueryAsync
    [HttpGet("QueryAsync")]
    public async Task<IActionResult> QueryAsync() {
      //透過ToListAsync方法就可以將Students所有資料取出
      var Result = await _context.Students.ToListAsync();
      return Ok(Result);
    }

步驟11-1

  • 寫新的對外API:QueryFirstOrDefaultAsync
    [HttpGet("QueryFirstOrDefaultAsync")]
    public async Task<IActionResult> QueryFirstOrDefaultAsync() {
      //取得第一筆
      var Result = await _context.Students.FirstOrDefaultAsync();
      return Ok(Result);
    }

步驟11-2

  • 交易機制 當有多張表需要異動時,為了確認資料的一致性,會需要透過交易機制做保護,只有全部成功或全部失敗。
    [HttpGet("TransactionsAsync")]
    public async Task<IActionResult> TransactionsAsync() {
      //開始資料庫交易
      using var trans = _context.Database.BeginTransaction();
      //建立一筆資料
      var data = new Student() { Name = "BillHuang", Age = 20 };
      //新增到Students資料表中
      _context.Students.Add(data);
      //執行,此步驟還不會真的異動到資料
      await _context.SaveChangesAsync();
      //取得第一筆資料
      var Result = await _context.Students.FirstOrDefaultAsync();
      //當執行了Commit後才會將上面的異動存到資料庫
      trans.Commit();
      return Ok(Result);
    }

步驟11-3

參考

N+1 交易

範例檔

GitHub