---
# System prepended metadata

title: '[112]天方科技 ASP.net core 教育訓練 1120316(c#教材簡介、SQL Server使用)'

---

# [112]天方科技 ASP.net core 教育訓練 1120316(c#教材簡介、SQL Server使用)

## C#微軟官方教材章節簡介
以WPF(Windows Presentation Foundation)為主，會與Web注重點略有不同
![](https://i.imgur.com/fZEbRew.png)
![](https://i.imgur.com/88b2DQr.png)


### Module 1-Module 5 是C#程式語言說明
### Module 1
C#語法簡介

### Module 2
建立方法/函式
例外狀況處理：錯誤訊息回報
應用程式監控：紀錄程式運作log

### Module 3
圖形介面的事件處理

### Module 4
建立型別
型別安全集合：泛型

### Module 5
建立類別階層─使用繼承
物件導向特性─
封裝：資料保存於物件內部，透過特定程序操作
繼承：一個類別會有**子類別**，子類別比父類別要更加具體化，類別只能繼承自一個類別，但是實作時可以多數，例犬(父)→中華田園犬(子)
多形：以一個基礎型別，操作所有繼承自此基礎型別的特定類型，各類型對相同訊息，做出不同動作

### Module 6之後是使用.NET提供的物件做資料存取
### Module 6
本地端資料讀寫

### Module 7
存取資料庫

### Module 8
遠端存取資料：透過Http、Client、Web Request等方式，存取遠端Json、XML、Html資料

### Module 9
同**Module 3**進階語法使用

### Module 10
改善應用程式效率─同步、非同步、多工等

### Module 11
介紹不受控碼(Unmanned code)：不受 .NET Framework環境管理的程式

參考：
[**什麼是 Managed 程式碼？**](https://learn.microsoft.com/zh-tw/dotnet/standard/managed-code)

### Module 12
可重複使用型別
組建：使用VS建立專案時，編譯後會產生 .exe或者 .dll檔，這兩個檔案是 .NET執行時的基本單位，每個獨立編譯的檔案，都可以透過 .exe/.dll 合成組建成應用程式，本章介紹不透過VS工具如何製作程式產生器

### Module 13
介紹 .NET資料加密/解密

參考：
[**微軟官網學習C#**](https://learn.microsoft.com/zh-tw/dotnet/csharp/)

## SQL Server
### Table關聯圖建立
![](https://i.imgur.com/frJTZNu.png)

### 選擇table
![](https://i.imgur.com/b4cl4PN.png)
![](https://i.imgur.com/kYQIvLB.png)


### 關聯F Key，將主資料表要關聯的欄位點擊拖曳至目標資料表(無須對準欄位)
![](https://i.imgur.com/8XUrM8q.png)

### 欄位名稱一樣會自動鎖定欄位
![](https://i.imgur.com/1NOHhJc.png)
![](https://i.imgur.com/3Tk3rMT.png)

### 完成
![](https://i.imgur.com/3ZaqNti.png)

### F Key有設定會影響EF Core Tool 的反向工程結果，DbContext增加此設定
![](https://i.imgur.com/sdXrzyX.png)
![](https://i.imgur.com/3jHmGej.png)

### 主資料表(s30_student)設定增加與目標資料表的關聯
![](https://i.imgur.com/RW0Tz7y.png)
![](https://i.imgur.com/pueDf8n.png)

### 目標資料表(s90_class)增加主資料表設定
![](https://i.imgur.com/nmKM1jG.png)
![](https://i.imgur.com/faHke8S.png)

### DB刪除F Key後，專案設定不改，依然可以正常運作
![](https://i.imgur.com/V66nCGJ.png)

### 要Get兩個資料表的資料，在專案有使用F Key的設定下，可使用`Include()`語法
```csharp=
//s30_studentController.cs
 [HttpGet]
        public async Task<ActionResult<IEnumerable<s30_student>>> Gets30_student()
        {
          if (_context.s30_student == null)
          {
              return NotFound();
          }
            return await _context.s30_student.Include(a => a.cls).ToListAsync(); //cls是s30_student.cs內的屬性
        }
```
```csharp=
//s30_student.cs
    public virtual s90_class cls { get; set; }
```
![](https://i.imgur.com/ZP63wpd.png)

### 此時使用Swagger測試Get功能，出現產生Json時有無窮迴圈的error
因為在EntityType s30_student和s90_class裡都有去撈取對方資料的屬性，所以執行Get動作時，就會不停互相取資料
```csharp=
//s30_student.cs
    public virtual s90_class cls { get; set; }
```
```csharp=
//s90_class.cs
    public virtual ICollection<s30_student> s30_student { get; } = new List<s30_student>();
```
![](https://i.imgur.com/REv4ZT6.png)

### 解決方法是在Program.cs檔加入以下程式碼
```csharp=
//取代原先builder.Services.AddControllers()
builder.Services.AddControllers().AddJsonOptions(x => x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);
//AddControllers()：.NET Core Controllers路徑處理方式
//AddJsonOptions：產生Json的相關選項
//JsonSerializerOptions：Json序列化選項
//ReferenceHandler：Json序列化參考處理器
//IgnoreCycles：忽略迴圈
```
![](https://i.imgur.com/wM3j8oc.png)
![](https://i.imgur.com/zCUg939.png)

### SQL Server→管理→SQL Server記錄檔，可查看Log檔
![](https://i.imgur.com/WQWQT9Y.png)

### 紀錄連線相關訊息，例如某帳號登入失敗，可檢查是哪個帳號，且原因為何
![](https://i.imgur.com/Kvn4aiZ.png)

### SQL Server→安全性→登入→選擇帳號右鍵→屬性
![](https://i.imgur.com/oSbQfoA.png)

### 登入屬性→使用者對應，可設定帳號對資料庫的使用權限
![](https://i.imgur.com/uvG1UZz.png)














