Entityframework-撞牆整理
前言
針對最近一些撞牆的問題作一下筆記....1.關閉初始化檢查:
由於資料表是由同事在負責建立、修改,所以我並不會作去相關的資料表異動。但我的DbContext使用的是CodeFirst的方式來撰寫(並沒有使用edmx來產生poco),這樣的方式在DbContext初始化後第一次執行的命令,還是會作相關的檢查,例:資料庫是否存在、資料表是否存在、Mirgration的檢查等等...以下為Trace Sql Profiler的截圖
解決方法:
Database.SetInitializer<SysCoreContext>(null);
2.多對多的資料表-加入關聯檔
資料表關係Ps:Entity不會有ROLE_USERS
若要將User的加入到不同的Role,必須從DbContext取出需要加入的Role,不能直接new一個Role來加入
正確
foreach (var role in myContext.ROLE.Where(r => selectRoleNos.Any(s => s == r.ROLE_NO)))
user.Roles.Add(role);
錯誤:
var selectRoleNos = new[] {"01","02" };
foreach (var roleNo in selectRoleNos)
user.Roles.Add(new ROLE { ROLE_NO = roleNo });
3.多對多的資料表-移除關聯檔
若只是要將使用者從某個Role刪除,需叫用RemoveuserExisit.Roles.Remove(oldRole);
4.多對多的資料表-刪除資料及所屬關聯檔
myContext.Entry(userExisit).State = System.Data.Entity.EntityState.Deleted;
*2014/05/19更新,叫用Remove即可 ps:在一對多的關聯下,若外部索引鍵充許null,使用上方程式碼則不會刪除,而是更新為null var userExisit = GetSysUserEntity(userNo);
myContext.SysCore.SYSUSER.Remove(userExisit);
針對上述2、3、4點執行前必須先載入使用者的相關資訊,例如Role資料載入(Include),這樣EntityFramework才可以根據載入的資料作處理
var userEntity = (from user in myContext.USER.Include("Roles")
where user.USER_NO == userNo
select user).SingleOrDefault();