1. 程式人生 > >MVC+EF之多表關聯數據更新

MVC+EF之多表關聯數據更新

選項 數據 返回 tro view ont 方式 自動 連接

多表關聯數據更新
關聯數據有兩種:一種是一對多,一種總是多對多
eg:假設一個用戶可以有任意多個角色,一個角色可以有任意多個用戶。 下面來實現編輯某個用戶時,顯示該用戶的角色進行編輯。
步驟:
1.先添加一個ViewModel, 用來表示角色是否分配給某個用戶。
2.打開UserRoleController,添加一個Edit的Action用來顯示編輯頁面。
3.打開Views\UserRole\Index.cshtml, 增加一個編輯按鈕
4.再根據Edit Action自動生成Edit View
5.修改相關內容,主要是兩點:其一是部門,其二市角色(角色是通過一組checkbox來顯示的。Checkbox顯示數據庫中所有角色,已分配給用戶的會顯示選中狀態。通過勾選checkbox的方式來實現用戶角色的更新)
註意:角色少這樣弄沒問題,如果多的話經典的做法,可以用兩個listbox,中間用箭頭將左右兩邊的選項移動


6.最後再完成HttpPost的Edit功能
a.首先更新SysUser表:用model binder中的值更新entity: userToUpdate.可以看到,我們使用了白名單指定數據庫中需要更新的字段。
TryUpdateModel(userToUpdate,"",new string[] {"LoginName","Email","Password","CreateDate","SysDepartmentID"})
b.再更新SysUserRole表:將數據庫中值和編輯後的值進行比對,基本邏輯是:如果被選中了,原來沒有的要添加;如果沒被選中,原來有的要刪除。
UpdateUserRoles(selectedRoles, userToUpdate);
註意:在UpdateUserRoles裏,我新建了一個連接using (AccountContext db2=new AccountContext())如果用之前的db會報如下錯誤:已有打開的與此 Command 相關聯的 DataReader,必須首先將它關閉。

原生SQL使用總結
A.原生SQL執行查詢:
需要返回實體模型,使用DbSet.SqlQuery (context會跟蹤,等效於LINQ方式)
需要返回其他類型,使用Database.SqlQuery
B.原生SQL執行更新:
使用Database.ExecuteSqlCommand

MVC+EF之多表關聯數據更新