2024年12月15日 星期日

【.Net Core】 EF Core + Web API 實作


 EF Core是Entity Framework在.Net Core使用的版本,功能幾乎相同,但具有輕巧、高擴充性以及高效能等優點,建議各位學習。


通常在.Net Core如果要用ORM的方式會有兩種選擇分別是EF Core以及Dapper。

從其他網路文章可以看到這兩種在最新版的效能其實都很接近了,只是定位有點不同,以下列出我目前覺得他們的定位導向(如有錯誤歡迎打臉指正我)

EF Core:適用於簡易查詢,有 Migrations、LINQ Support以及Lazy loading等等優點

Dapper:適用於簡易查詢以及複雜查詢(各種Join或Union),原因是複雜查詢用T-SQL難度較低於用LINQ的EF Core。

網路文章提供的功能比較圖


從以上兩點可以看到其實可以在一個專案同時使用兩種不同的方式去使用各自的優點。

例如Rico大大提到的使用EF Core 的Code First跟Migration,Dapper則拿來用複雜Query(or store procedures)

那就廢話不多說,開始來實作玩玩看

這次標的為 .Net 6 Web API + EF Core 7


首先先建立專案(範例都用預設,有其他需求再自行調整)


建立完透過Nuget安裝以下Package

Microsoft.EntityFrameworkCore    

Microsoft.EntityFrameworkCore.SqlServer  

Microsoft.EntityFrameworkCore.Tools  =>Scaffold-DbContext指令需要此套件


在PMC(Package Manager Console)下Scaffold-DbContext指令,產生DbContext

路徑:「Tools」=>「NuGet Package Manager」=>「Package Manager Console」

指令範例:

Scaffold-DbContext "Server=伺服器位置;Database=資料庫名稱;TrustServerCertificate=True;MultipleActiveResultSets=true;User ID=使用者帳號;Password=密碼" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

p.s.如果沒有現有資料庫可用範例資料庫(Northwind)

執行完就會發現根目錄多一個Models資料夾,打開就可以看資料庫已有的Table以及Context Class



從DbContext當中可以看到,DbSet的變數名稱會是table名稱(不可更動),因與Model Class區隔,建議在Table的命名上使用複數名稱,例如Orders、Users。



在繼承自DbContext的NorthwindContext.cs程式中預設在

OnConfiguring方法中有一串標記為警告的代表含意是說不建議把連線資訊放在程式中

這邊等等就會替換掉,暫不處理


這時我們可以透過VS去產生對應於Model的Controller,先對Controllers按右鍵並點選Add->Controller,會跳出一個視窗


我們選擇API->API Controller with action,using Entity Framework後,再來會跳出視窗去選擇要使用哪個Model


隨便選一個Model當作練習標的,點選Add後就可以看到Controller已經建立成功

他會建立基本CRUD對應於Http action



這時先別急著執行,因為還沒處理剛剛說的DbContext內OnConfiguring 警告,先將連線字串放到appsettings.json(如下紅字部分)

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "server=資料庫位置;uid=使用者帳號;pwd=密碼;database=資料庫名稱;Max Pool Size=1000;TrustServerCertificate=True;"
  }
}

因為.Net Core專案都是透過DI方式注入各種Service,當然資料庫服務也不例外,在Program.cs內加入以下紅字去注入服務(預設是Scoped,每個Request都是獨立Service)

            // Add services to the container.
            builder.Services.AddControllers();

            builder.Services.AddDbContext<RdErpV1Context>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")
                //可設定相關參數,例如Command Timeout,etc.
                //,providerOptions=> providerOptions.CommandTimeout(60)
                ));

            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();

再去執行去使用Swagger去測試,就可以成功從資料取得資料





參考文章:

https://ithelp.ithome.com.tw/articles/10262110



















沒有留言:

張貼留言

【.Net Core】 EF Core + Web API 實作

 EF Core是Entity Framework在.Net Core使用的版本,功能幾乎相同,但具有輕巧、高擴充性以及高效能等優點,建議各位學習。 通常在.Net Core如果要用ORM的方式會有兩種選擇分別是EF Core以及Dapper。 從其他網路文章可以看到這兩種在最新...