首先來看一下 示範資料庫的 ER-Model

Entity Framework级联更新

User 使用者
Group 群組
UserDepartment 使用者部門

  

需求是要建立一個 User 包含 UserDepartment 以及 Group,
直接來看語法

方式一

01 using (TestEntities te = new TestEntities())
02 {         
03     ////新增一個 User
04     User u = new User()
05     {
06         User_name = "David",           
07         User_email = "asdtey@yahoo.com.tw",
08         ////此為多對一時的新增方式               
09         UserDepartment = te.UserDepartment.Where(a => a.UserDepartment_name == "開發部").First()
10     };
11  
12     ////新增User屬於的群組
13  
14     ////先取得要新增的群組
15     Group g1 = te.Group.Where(a => a.Group_name == "攝影社").First();
16     Group g2 = te.Group.Where(a => a.Group_name == "開發二").First();
17     ////多對多的新增方式
18     u.Group.Add(g1);
19     u.Group.Add(g2);
20  
21     te.AddToUser(u);  
22  
23     ////儲存
24     te.SaveChanges();           
25 }

此方法可以順利新增一個 User 同時包含 UserDepartment 以及 Group,
不過有個問題是說仔細去看語法時,
會發現在新增之前會先去資料庫取得UserDepartment 以及 Group 的資料,才進行新增,
但我只是要新增 User ,並沒有要取得 UserDepartment 、 Group 的資料,
每次新增都先去資料庫撈資料,會影響效能,
這邊分享另一種寫法

方法二

01 ////方式二
02 using (TestEntities te = new TestEntities())
03 {
04     ////新增一個 User
05     User u = new User()
06     {
07         User_name = "David",
08         User_email = "asdtey@yahoo.com.tw",                   
09     };
10  
11     ////此為多對一時的新增方式      
12     UserDepartment userDepartment = new UserDepartment()
13     {
14         EntityKey = new EntityKey("TestEntities.UserDepartment", "UserDepartment_id", 1),
15         UserDepartment_id = 1
16     };
17     te.Attach(userDepartment); 
18     u.UserDepartment = userDepartment;
19  
20     //////多對多的新增方式
21     Group g1 = new Group()
22     {
23         EntityKey = new EntityKey("TestEntities.Group", "Group_id", 1),
24         Group_id = 1
25     };
26     te.Attach(g1);               
27     u.Group.Add(g1);
28  
29     Group g2 = new Group()
30     {
31         EntityKey = new EntityKey("TestEntities.Group", "Group_id", 2),
32         Group_id = 2
33     };
34     te.Attach(g2);
35     u.Group.Add(g2);
36  
37     ////儲存
38     te.AddToUser(u);
39     te.SaveChanges();
40 }

 此方法利用EntityKey讓ObjectContext知道我們要關聯的物件是甚麼,
就不會先去資料庫撈資料,提升效能,
但是缺點是要打的code變多了,也缺少IntelliSence

再分享一下,如果只要新增User以及UserDepartment(多對一關係)時,
還可以這樣寫,

方法三

01 ////方式三
02 using (TestEntities te = new TestEntities())
03 {
04     ////新增一個 User
05     User u = new User()
06     {
07         User_name = "David",
08         User_email = "asdtey@yahoo.com.tw",
09     };
10  
11     u.UserDepartmentReference.EntityKey = new EntityKey("TestEntities.UserDepartment", "UserDepartment_id", 1);               
12  
13     ////儲存
14     te.AddToUser(u);
15     te.SaveChanges();
16 }

 建議在大量新增的時候 可以使用方法二 避免影響效能及資料庫

 

一樣先來看一下 示範資料庫的 ER-Model

Entity Framework级联更新

User 使用者
Group 群組
UserDepartment 使用者部門


需求是要修改 User的資料  包含 UserDepartment 以及 Group,
直接來看語法

01 using (TestEntities te = new TestEntities())
02 {
03     ////取得 David 資料
04     var u = te.User.Where(a => a.User_name == "David").First();
05     u.Group.Load();
06     u.UserDepartmentReference.Load();
07      
08     ////修改 Email
09     u.User_email = "asdtey@yahoo.com.tw";          
10     te.SaveChanges();
11      
12  
13     //修改使用者部門
14  
15     ////先取得要變更成的部門
16     var t = te.UserDepartment.Where(a => a.UserDepartment_name == "經理部").First();  
17     ////重新給予部門
18     u.UserDepartment = t;         
19     te.SaveChanges();
20      
21  
22     //修改群組
23  
24     ////因為 User 與 Group 為多對多的關係
25     ////因此修改方式為 刪除與新增
26  
27     ////刪除群組
28     var g = u.Group.First();           
29     u.Group.Remove(g);
30  
31     ////取得要新增的群組
32     var g1 = te.Group.Where(a => a.Group_name == "電研社").First();
33     u.Group.Add(g1);
34      
35     te.SaveChanges();
36 }

相关文章:

  • 2022-03-08
  • 2022-12-23
  • 2021-09-01
  • 2022-12-23
  • 2021-09-24
  • 2022-12-23
  • 2022-02-20
  • 2022-01-25
猜你喜欢
  • 2021-06-05
  • 2021-09-04
  • 2021-09-03
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案