Download presentation
Presentation is loading. Please wait.
1
Entity Framework 建國科技大學 資管系 饒瑞佶
2
Entity Framework ADO.NET 進階存取框架 簡化SQL指令編寫工作
透過ORM(Object Relational Mapping) 物件結構與資料庫綱要間的對應 程式設計者只要熟悉物件操作就可以存取資料庫,無須學習SQL指令,而是透過Linq to Entities(使用到匿名委派函數)
3
ORM AP Object API 物件操作服務 Mapping Services 物件操作轉資料庫操作服務 DB Provider
LINQ to Entities Object API 物件操作服務 Object Services Entity SQL Services Mapping Services 物件操作轉資料庫操作服務 DB Provider 資料庫操作服務 ADO.NET DB
4
EF分類 資料優先:Database First 模式優先:Model First 程式優先:Code First
依據現有資料庫綱要產生對應塑模 最好入門 模式優先:Model First 在專案中定義資料模型,對應產生資料庫 程式優先:Code First 透過程式產生資料庫綱要與關聯,並操作資料庫 不需要知道資料庫種類與版本
5
擴充Entity Framework 確認是否已經存在?
6
完整的EF架構 在ADO.NET實體資料模型應該有四個選項,而不是預設的兩個
11
出現ADO.NET實體資料模型
12
Install EF tools 選擇對應的VS版本安裝
13
現在變成四個了
14
Database First
15
Database First 新增一個ADO.NET實體資料模型
17
也可以使用local DB
18
App.config中儲存的名稱 後面存取時會使用到
21
會出現下面視窗
22
Entity Data Model
23
Northwind.edmx
24
Northwind.tt 產生資料庫物件所對應的程式碼檔案
25
DB
26
透過EF存取資料庫 前面建立EF模型時在App.config中儲存的名稱 資料表名稱
using (NorthwindEntities context = new NorthwindEntities()) { var query = from item in context.Employees select new a = item.FirstName, b = item.BirthDate, c = item.Address }; foreach (var item in query) listBox1.Items.Add("Name=" + item.a + "/Birthday=" +item.b + "/address=" + item.c); } 資料表名稱
27
result
28
可以直接用在ASP.NET
29
整合dataGridView
30
RESULT 資料目前在記憶體中(offline模式) 與DataSet相同 不具備同步功能
31
修改資料 直接透過dataGridView或綁定物件(下一頁)進行修改 再透過SaveChanges方法同步資料庫
context.SaveChanges(); 新增/刪除無法透過此語法進行
32
綁定物件 先加入bindingsource1物件
33
再加入輸入框物件綁定 textBox1.DataBindings.Add("Text", bindingSource1, "CompanyName", true, DataSourceUpdateMode.OnPropertyChanged); 這裡自動會雙向同步,也就是修改TextBox,dataGridView也會改 與DataSet不同
34
從鍵盤刪除 透過物件操作 Customers是資料表物件 取得bindingsource目前的資料物件 從EF中移除資料物件 回寫同步資料庫
35
var p = (Customers)bindingSource1.Current;
context.Customers.Remove(p); context.SaveChanges(); // 更新記憶體中的EF foreach (var entity in context.ChangeTracker.Entries()) { entity.Reload(); } // 重新整理datagridview dataGridView1.DataSource = bindingSource1; 這裡一定要更新,否則會造成下次異動時 資料不同步問題,例如新增後刪除,少了這個變成資料庫已經刪除,但EF內仍有資料,再新增時就會出錯
36
從bindingNavigator刪除 bindingNavigator1_ItemClicked事件
if (object.ReferenceEquals(e.ClickedItem, this.bindingNavigatorDeleteItem)) { DialogResult useranswer = MessageBox.Show("確定要刪除?", "刪除提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (useranswer == DialogResult.OK) // 刪除資料 var p = (Customers)bindingSource1.Current; context.Customers.Remove(p); context.SaveChanges(); // 更新記憶體內的EF foreach (var entity in context.ChangeTracker.Entries()) entity.Reload(); } // 重新整理datagridview this.bindingSource1.DataSource = context.Customers.ToList(); else this.bindingNavigator1.DeleteItem = null;
37
搜尋(I) 這裡用到大量的匿名委派函數 完全比對 dataGridView1.DataSource = context.Customers.Where(x => x.CompanyName == "Alfreds Futterkiste").ToList(); 資料來自於物件的完全比對 dataGridView1.DataSource = context.Customers.Where(x => x.CompanyName == textBox1.Text).ToList();
38
搜尋(II) 資料來自於物件的模糊比對 dataGridView1.DataSource = context.Customers.Where(x => x.CompanyName.Contains(textBox2.Text)).ToList(); 資料來自於物件的模糊比對+排序+顯示指定欄位 dataGridView1.DataSource = context.Customers.Where(x => x.CompanyName.Contains(textBox2.Text)) .OrderBy(x=>x.Country) .Select(x => new { x.CompanyName, x.Address, x.Country }).ToList();
39
新增 var t = new Customers //Customers是資料表名稱 { // 設定欄位值
//CustomerID = Guid.NewGuid(), //如果是自動編號 CustomerID = "aa", CompanyName = "aa", }; context.Customers.Add(t); // 新增資料到EF context.SaveChanges(); // 同步資料到資料庫 // 重新整理datagridview this.bindingSource1.DataSource = context.Customers.ToList();
40
Model First
41
Model First 新增一個ADO.NET實體資料模型 選擇空的EF Designer模型
42
從空白的EF Designer開始設計
43
拖曳一個實體到Designer
44
重新命名為Blog 建立資料庫時的名稱
45
加入純量屬性 新增4個屬性
46
Id屬性設定
47
設定型別 欄位 型別 Id Guid (PK) OwnerId int Caption String DateCreated
DateTime
49
同樣方法建立BlogArticle資料表
欄位 型別 Id Guid (PK) BlogId Guid (FK) Subject String Body DateCreated DateTime DateModified
50
完成後
51
建立關聯
52
關聯屬性
53
由模型產生資料庫
54
選擇要使用的資料庫
55
DDL (Data Definition Language)
56
執行DDL 導致連接中斷
57
如果沒成功可以再執行一次DDL
58
DDL命令執行完成
59
result
60
檢視App.config 透過Model First新增的實體Entity 後面的使用方式與前面的NorthWindEntities相同
61
上一個Model First是把資料表新增到既有資料庫 這裡是要直接建立資料庫與資料表
Re-Model First 上一個Model First是把資料表新增到既有資料庫 這裡是要直接建立資料庫與資料表
63
一樣建立兩張表與關聯
64
加入程式碼產生項目
65
BlogModel.tt
66
產生建立資料庫的code
67
由模型產生資料庫
68
選擇新增連接
69
輸入BlogDB資料庫 這裡會建立資料庫
70
確認已建立資料庫
72
產出DDL
73
執行DDL 導致連接中斷
74
重新執行DDL
75
資料庫產生完成 BEFORE AFTER
76
Code first 寫程式建立需要的DB與Table
77
先試試從資料庫產生對應的ER Class
78
選擇DB 連線字串
79
選擇資料表,EF會自動建立對應的程式類別
80
建立完成的類別 這邊規範資料表的建立
81
App.config
82
每張資料表再產生一個對應的類別
83
如果要全部自己來
Similar presentations