ADO.Net Entity Framework : (十三) 關聯式資料 - 新增

延續上篇 ADO.Net Entity Framework (十一) : 關聯式資料 - 查詢 ,
這次來分享一下新增的語法,並介紹如何在新增關聯式資料時,
利用EntityKey,來提升效能

延續上篇 ADO.Net Entity Framework (十一) : 關聯式資料 - 查詢
這次來分享一下新增的語法,

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

2009-10-12_122043

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

  

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

方式一


        using (TestEntities te = new TestEntities())
        {          
            ////新增一個 User
            User u = new User()
            {
                User_name = "David",            
                User_email = "asdtey@yahoo.com.tw",
                ////此為多對一時的新增方式                
                UserDepartment = te.UserDepartment.Where(a => a.UserDepartment_name == "開發部").First() 
            };

            ////新增User屬於的群組

            ////先取得要新增的群組
            Group g1 = te.Group.Where(a => a.Group_name == "攝影社").First();
            Group g2 = te.Group.Where(a => a.Group_name == "開發二").First();
            ////多對多的新增方式
            u.Group.Add(g1); 
            u.Group.Add(g2);

            te.AddToUser(u);   

            ////儲存
            te.SaveChanges();            
        }

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

方法二


            ////方式二
            using (TestEntities te = new TestEntities())
            {
                ////新增一個 User
                User u = new User()
                {
                    User_name = "David",
                    User_email = "asdtey@yahoo.com.tw",                    
                };

                ////此為多對一時的新增方式       
                UserDepartment userDepartment = new UserDepartment()
                {
                    EntityKey = new EntityKey("TestEntities.UserDepartment", "UserDepartment_id", 1),
                    UserDepartment_id = 1
                };
                te.Attach(userDepartment);  
                u.UserDepartment = userDepartment;

                //////多對多的新增方式
                Group g1 = new Group()
                {
                    EntityKey = new EntityKey("TestEntities.Group", "Group_id", 1),
                    Group_id = 1
                };
                te.Attach(g1);                
                u.Group.Add(g1);

                Group g2 = new Group()
                {
                    EntityKey = new EntityKey("TestEntities.Group", "Group_id", 2),
                    Group_id = 2
                };
                te.Attach(g2);
                u.Group.Add(g2);

                ////儲存
                te.AddToUser(u);
                te.SaveChanges();
            }

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

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

方法三


            ////方式三
            using (TestEntities te = new TestEntities())
            {
                ////新增一個 User
                User u = new User()
                {
                    User_name = "David",
                    User_email = "asdtey@yahoo.com.tw",
                };

                u.UserDepartmentReference.EntityKey = new EntityKey("TestEntities.UserDepartment", "UserDepartment_id", 1);                

                ////儲存
                te.AddToUser(u);
                te.SaveChanges();
            }

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

參考資料
EntityKey
ObjectContext..::.Attach 方法




 


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的""給予支持,非常感激
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝