ADO.NET Note
- 用來對DB做CRUD
- 不同類型DB要使用不同namespace
- 目前mysql的namespace有bug
- 修改DB時,用parameter的方式避免sql injection
|
DataAdapter |
DataReader |
| 連結資料庫 |
不用,會自動開啟關閉 |
SqlConnection.Open() |
| 執行SQL指令 |
SqlDataAdapter.Fill().Open() |
SqlCommand ExecuteReader() ExecuteNonQuery() |
| 資料指標移動 |
讀到記憶體裡 |
順向且唯獨 |
| 如何處理資料 |
可以處理複雜資料庫關聯跟多個DataTable |
適合單一資料表 |
| 消耗資源 |
較大 |
較小 |
| 分頁 |
有 |
無 |
Entity Framework
LINQ
- 查詢資料時不需另外學習查詢語法(xml或sql),可以用該語言的語法查資料
- 有形別檢查以及auto complete
- 用來對obj或sql進行查詢的介面(provider),例如
LINQ-to-SQL
LINQ-to-DataSets
- 用LINQ查詢DataSets的物件(在用ORM之前,只能用ADO.NET處理DataSets或DataTables等物件)
LINQ-to-Object
- 把LINQ查詢直接和IEnumerable一起用,不使用provide例如LINQ to SQL等,可以查詢任何Enumerable的集合
- IEnumerable介面
- 能夠避免使用foreach循環等複雜方式從集合中搜尋資料
IEnumerable
- data來自memory,所以把IQueryable的東東用AsEnumerable轉換,會把整個表存進去memory,效率低
- ToList會用到
LINQ-to-Entities
IQueryable
比較及使用場景
|
IEnumerable |
IQueryable |
| data來源 |
memory |
SQL |
| lazy load特性 |
有 |
有 |
| 使用場景 |
查詢資料庫 |
查詢memory內的資料(本地) |
lazy load:使用前才跑SQL
IQueryable特性實驗
AsEnumerable和AsQueryable使用時機
Raw SQL Query
- 在EF Core之下,可以直接下SQL指令,可以搭配LINQ使用
- 搭配LINQ時,必須用Select開頭的查詢SQL語法
- 單純讀取資料可以用加上AsNoTracking(),取消對變更的追蹤,執行速度會更快
Database First
- 有GUI
- 適合原本就有資料庫,當資料庫定義更新,可以直接update到模型檔(.edmx),更新後資料會消失要注意
- 性能較差,適合初學者或資料庫結構成熟穩定的方案
Code First
- 用程式碼產生資料庫,和Model First方法類似,只是改成用程式碼設計POCO模型
- 沒有GUI
- MS推薦的開發方式
- 原本沒有資料庫,先用class定義好資料庫的內容,沒有資料庫也可以用工具生成class
Step
- 定義好資料模型和xxxContext
- 建立資料模型,主要是新建一個class,裡面宣告欄位,用Fluent API或Data Annotations定義欄位大小或Primary Key等資料欄位
- 資料模型內預設用
Id作為Primary Key,也可以自行定義ExampleId名稱,用Data Annotation 加上[Key]的Tag
- xxxContext定義操作資料庫的細節
|
優 |
缺 |
| Fluent API |
保持POCO乾淨,可以做table關聯 |
不能給前端驗證 |
| Data Annottations |
可用來給前端驗證,scaffolding可以生成view,但也會暴露model結構給前端 |
Table關聯不好做 |
- 在program.cs設定好connectString
- 輸入遷移指令
dotnet ef migrations add init --context xxxContext
- 輸入更新指令
dotnet ef database update --context xxxContext
Model First
- EF Core已移除
- 用工具設計EDM後再生成資料庫和程式碼
RESTful API
沒空繼續寫…
留言
張貼留言