Entityframework-撞牆整理

前言

針對最近一些撞牆的問題作一下筆記....

1.關閉初始化檢查:

   由於資料表是由同事在負責建立、修改,所以我並不會作去相關的資料表異動。但我的DbContext使用的是CodeFirst的方式來撰寫(並沒有使用edmx來產生poco),這樣的方式在DbContext初始化後第一次執行的命令,還是會作相關的檢查,例:資料庫是否存在、資料表是否存在、Mirgration的檢查等等...
以下為Trace Sql Profiler的截圖
image



image
image
解決方法:
Database.SetInitializer<SysCoreContext>(null);

2.多對多的資料表-加入關聯檔

資料表關係

image


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刪除,需叫用Remove

userExisit.Roles.Remove(oldRole);

4.多對多的資料表-刪除資料及所屬關聯檔

若要刪除使用者及所屬的RoleUser關係檔,則須設定為刪除狀態
        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();

這個網誌中的熱門文章

IIS 設定只允許特定IP進入