iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0

目的

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

同步更新於個人部落格
EFCore語法說明

1.建立新專案

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

2.設定新的專案

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

3.其他資訊

直接進行下一步
步驟3

4.NuGet加入套件

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

步驟4

5.新增Student.cs類別檔

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

6.編輯Student.cs類別檔

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

範例6-1

7.新增EFCoreContext.cs類別檔

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

8.編輯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

9.編輯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

10.到套件管理器主控台下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

11.編輯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


上一篇
[.net 6] EFCore範例
下一篇
[.net 6] Serilog範例
系列文
.net6套件入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
ruhui0726
iT邦新手 4 級 ‧ 2022-10-06 09:26:33

恭喜隊員撐過2/3了/images/emoticon/emoticon30.gif

billhuang iT邦新手 1 級 ‧ 2022-10-06 11:49:05 檢舉

快撐過了,你們這些已經完成的傢伙/images/emoticon/emoticon06.gif

我要留言

立即登入留言