於 .net core 使用 EF Core 技術讀取資料庫

 

以下示範使用 EF Core 技術讀取資料庫

一、資料準備

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-- create table
CREATE TABLE [dbo].[student] (
[student_id] [NVARCHAR](50) NOT NULL
,[student_name] [NVARCHAR](50) NOT NULL
)

CREATE TABLE [dbo].[score] (
[score_id] [NVARCHAR](50) NOT NULL
,[student_id] [NVARCHAR](50) NOT NULL
,[subject] [NVARCHAR](50) NOT NULL
,[score] [int] NOT NULL
)

-- create data
INSERT [dbo].[student] ([student_id], [student_name]) VALUES ('9527', N'Bill')
INSERT [dbo].[student] ([student_id], [student_name]) VALUES ('0204', N'Tom')
INSERT [dbo].[score] ([score_id], [student_id], [subject], [score]) VALUES ('1', N'9527', 'english', 90)
INSERT [dbo].[score] ([score_id], [student_id], [subject], [score]) VALUES ('2', N'9527', 'math', 50)
INSERT [dbo].[score] ([score_id], [student_id], [subject], [score]) VALUES ('3', N'0204', 'english', 60)
INSERT [dbo].[score] ([score_id], [student_id], [subject], [score]) VALUES ('4', N'0204', 'math', 30)

二、開一個 .net core ConsoleApp 專案

三、於 NuGet 安裝相關套件,指令如下

請於 Package Manager Console 依序執行以下指令

  1. 安裝 Microsoft.Extensions.Configuration.Json 套件,之後範例會用到(非必要)

    1
    $ Install-Package Microsoft.Extensions.Configuration.Json
  2. 首先要先安裝 dotnet ef 的全域工具,才能使用 dotnet ef 的指令

    1
    $ dotnet tool install --global dotnet-ef
  3. 添加 Microsoft.EntityFrameworkCore.SqlServer nuget 套件
    注意,要到該專案資料夾路徑下安裝。

    1
    $ dotnet add package Microsoft.EntityFrameworkCore.SqlServer

    (資料庫的Provider,用來與相對性的資料庫溝通)

如果是 MySql 的話,則使用下列指令

1
$ dotnet add package Pomelo.EntityFrameworkCore.MySql
  1. 添加 Microsoft.EntityFrameworkCore.Design nuget 套件

    1
    $ dotnet add package Microsoft.EntityFrameworkCore.Design

    (沒有安裝無法透過cli 使用資料庫產生實體)

  2. 先行添加空的 Program.cs,並成功編譯過,以利下一步驟進行

    1
    2
    3
    4
    5
    6
    7
    class Program
    {
    static void Main(string[] args)
    {

    }
    }
  3. 之後要透過以下指令來透過資料庫產生實體

    1
    $ dotnet ef dbcontext scaffold "server=USER\SQLEXPRESS;Database=myDB;Trusted_Connection=False;MultipleActiveResultSets=true;Encrypt=False;User ID=sa;Password=pw" "Microsoft.EntityFrameworkCore.SqlServer" -o ./Models -c SchoolContext -f

    如果是 MySql 的話,則使用下列指令

    1
    $ dotnet ef dbcontext scaffold "server=localhost;Port=3306;Database=myDB;User ID=root;Password=pw" "Pomelo.EntityFrameworkCore.MySql" -o ./Models -c SchoolContext -f

四、於 SchoolContext.cs 移除敏感連線參數
找到下面方法,移除他。或是在上面指令 build 實體的時候,加上 --no-onconfiguring 參數,不要產生 OnConfiguring 方法

1
2
3
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
=> optionsBuilder.UseSqlServer("server=USER\\SQLEXPRESS;Database=test_db;Trusted_Connection=False;MultipleActiveResultSets=true;Encrypt=False;User ID=sa;Password=pw");

而連線參數改用 appsettings.json 來取得
而連線參數的 appsettings.json 設定檔內容大致如下

1
2
3
4
5
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=USER\\SQLEXPRESS;Database=test_db;Trusted_Connection=False;TrustServerCertificate=true;MultipleActiveResultSets=true;User ID=sa;Password=pw"
}
}

五、於 Program.cs 改成下面程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using ConsoleApp1.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

class Program
{
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();

var services = new ServiceCollection()
.AddDbContext<SchoolContext>(option => option.UseSqlServer(configuration.GetConnectionString("DefaultConnection")))
.BuildServiceProvider();

var db = services.GetRequiredService<SchoolContext>();

foreach (var s in db.Students)
{
Console.WriteLine($"Customer ID: {s.StudentId}, Name: {s.StudentName}");
}
}
}

參考資料:
[Day05] Entity Framework Core與DB First - 我與 ASP.NET Core 3 的 30天
.NET Core第10天_搭配EF Core串聯資料庫Db First_使用EntityFramework執行檢視的MVC控制器
Entity Framework Core tools reference - .NET Core CLI