首先來看一下 示範資料庫的 ER-Model
User 使用者
Group 群組
UserDepartment 使用者部門
需求是要建立一個 User 包含 UserDepartment 以及 Group,
直接來看語法
方式一
01 | using (TestEntities te = new TestEntities()) |
07 | User_email = "asdtey@yahoo.com.tw" , |
09 | UserDepartment = te.UserDepartment.Where(a => a.UserDepartment_name == "開發部" ).First() |
15 | Group g1 = te.Group.Where(a => a.Group_name == "攝影社" ).First(); |
16 | Group g2 = te.Group.Where(a => a.Group_name == "開發二" ).First(); |
此方法可以順利新增一個 User 同時包含 UserDepartment 以及 Group,
不過有個問題是說仔細去看語法時,
會發現在新增之前會先去資料庫取得UserDepartment 以及 Group 的資料,才進行新增,
但我只是要新增 User ,並沒有要取得 UserDepartment 、 Group 的資料,
每次新增都先去資料庫撈資料,會影響效能,
這邊分享另一種寫法
方法二
02 | using (TestEntities te = new TestEntities()) |
08 | User_email = "asdtey@yahoo.com.tw" , |
12 | UserDepartment userDepartment = new UserDepartment() |
14 | EntityKey = new EntityKey( "TestEntities.UserDepartment" , "UserDepartment_id" , 1), |
17 | te.Attach(userDepartment); |
18 | u.UserDepartment = userDepartment; |
21 | Group g1 = new Group() |
23 | EntityKey = new EntityKey( "TestEntities.Group" , "Group_id" , 1), |
29 | Group g2 = new Group() |
31 | EntityKey = new EntityKey( "TestEntities.Group" , "Group_id" , 2), |
此方法利用EntityKey讓ObjectContext知道我們要關聯的物件是甚麼,
就不會先去資料庫撈資料,提升效能,
但是缺點是要打的code變多了,也缺少IntelliSence
再分享一下,如果只要新增User以及UserDepartment(多對一關係)時,
還可以這樣寫,
方法三
02 | using (TestEntities te = new TestEntities()) |
08 | User_email = "asdtey@yahoo.com.tw" , |
11 | u.UserDepartmentReference.EntityKey = new EntityKey( "TestEntities.UserDepartment" , "UserDepartment_id" , 1); |
建議在大量新增的時候 可以使用方法二 避免影響效能及資料庫
一樣先來看一下 示範資料庫的 ER-Model
User 使用者
Group 群組
UserDepartment 使用者部門
需求是要修改 User的資料 包含 UserDepartment 以及 Group,
直接來看語法
01 | using (TestEntities te = new TestEntities()) |
04 | var u = te.User.Where(a => a.User_name == "David" ).First(); |
06 | u.UserDepartmentReference.Load(); |
09 | u.User_email = "asdtey@yahoo.com.tw" ; |
16 | var t = te.UserDepartment.Where(a => a.UserDepartment_name == "經理部" ).First(); |
24 | ////因為 User 與 Group 為多對多的關係 |
28 | var g = u.Group.First(); |
32 | var g1 = te.Group.Where(a => a.Group_name == "電研社" ).First(); |
修改部分比較簡單,下次來介紹刪除的部分
一樣先來看 ER-Model
需求是要刪除使用者(User)資料,
來看看範例
範例一
02 | using (TestEntities te = new TestEntities()) |
05 | var u = te.User.Where(a => a.User_name == "David" ).First(); |
這段語法看起來正常,但是一執行卻發生
'/ADOEntityFrameworkDemo' 應用程式中發生伺服器錯誤。
The DELETE statement conflicted with the REFERENCE constraint "FK_UserGroup_User". The conflict occurred in database "Test", table "dbo.UserGroup", column 'UserGroup_userid'.
The statement has been terminated.
描述: 在執行目前 Web 要求的過程中發生未處理的例外情形。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。
例外詳細資訊: System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_UserGroup_User". The conflict occurred in database "Test", table "dbo.UserGroup", column 'UserGroup_userid'.
The statement has been terminated.
@@ 原來是因為還有 Reference ,
再把語法修改一下
範例二
02 | using (TestEntities te = new TestEntities()) |
05 | var u = te.User.Where(a => a.User_name == "David" ).First(); |
07 | ////ADO.Net Framework 在刪除的時候,會連帶一起刪除關連的資料 |
10 | u.UserDepartmentReference.Load(); |
這段語法就可以順利執行囉
說明一下,ADO.Net Entity Framework 在處理關聯式資料的時候,會把相關的所有資料一起刪除,
但是前提是在刪除前,必須先使用【Load】方法,把相關聯資料載入