EF架構~關于多對多關系表無法更新與插(cha)入(ru)的問(wen)題
在EF里(li),我們設計模(mo)型時,會(hui)(hui)設計到多對多關(guan)系(xi),在EF里(li)會(hui)(hui)把這(zhe)種(zhong)關(guan)系(xi)會(hui)(hui)轉成兩個一對多的(de)(de)關(guan)系(xi)表,這(zhe)是比較友(you)好(hao)的(de)(de),因為多對多來(lai)說,對于(yu)業務本(ben)身沒(mei)什么意(yi)思,所以(yi)隱藏了(le),沒(mei)什么壞(huai)處(chu),但(dan)對于(yu)這(zhe)個隱藏來(lai)說,對開發人員來(lai)講你(ni)就無法(fa)主動控制這(zhe)張(zhang)關(guan)系(xi)表了(le),而需要使用EF的(de)(de)update來(lai)更(geng)(geng)新(xin)(xin)主表的(de)(de)同時去更(geng)(geng)新(xin)(xin)關(guan)系(xi)表,這(zhe)對于(yu)初學者會(hui)(hui)出現一些問題,今天(tian)說的(de)(de)就是多對多關(guan)系(xi)無法(fa)更(geng)(geng)新(xin)(xin)和插(cha)入的(de)(de)問題.
數據結構
public partial class WebManageRoles : Lind.DDD.Domain.Entity { public WebManageRoles() { this.WebManageMenus = new List<WebManageMenus>(); this.WebManageUsers = new List<WebManageUsers>(); } [DisplayName("名稱"), Required] public string RoleName { get; set; } [DisplayName("關于")] public string About { get; set; } [DisplayName("排序"), Required] public int SortNumber { get; set; } [DisplayName("最后(hou)操作人")] public string Operator { get; set; } [DisplayName("權限"), Required] public int OperatorAuthority { get; set; } [DisplayName("部門"), Required] public int DepartmentID { get; set; } public virtual WebDepartments WebDepartments { get; set; } public virtual ICollection<WebManageMenus> WebManageMenus { get; set; } public virtual ICollection<WebManageUsers> WebManageUsers { get; set; } }
關于AutoDetectChangesEnabled
參考://msdn.microsoft.com/en-us/data/jj556205.aspx
大叔的解釋,當AutoDetectChangesEnabled為(wei)true時(shi),可以加(jia)載依賴(lai)的關系,在插入和更(geng)新時(shi)會有同(tong)步完(wan)成(多對多,一對多關系時(shi)使用),當(dang)值為(wei)false時(shi),只更(geng)新(插入)主(zhu)表(biao)的數據
問題解決
old.WebManageMenus = menuRepository.GetModel(i => menu.Contains(i.Id)).ToList(); old.DepartmentID = dept; old.RoleName = entity.RoleName; old.SortNumber = entity.SortNumber; old.About = entity.About; old.DataUpdateDateTime = DateTime.Now; roleRepository.Update(old);
在數據上下文中的設置
public ManagerContext() : base("DefaultConnection") { this.Configuration.AutoDetectChangesEnabled = true;//對多對多,一對多進行curd操作時需要(yao)為(wei)true this.Configuration.LazyLoadingEnabled = false; this.Configuration.ProxyCreationEnabled = false;//禁(jin)止動(dong)態攔截System.Data.Entity.DynamicProxies. }
對技術的研究與(yu)探索(suo),我們還在繼續和堅持...