EF架構(gou)~單表一對多集(ji)合的插入(樹型(xing)結構(gou))
單(dan)表(biao)一(yi)對(dui)多(duo)關(guan)系(xi)很常(chang)見(jian),它是一(yi)種樹形結構,如系(xi)統(tong)菜單(dan)表(biao),部門表(biao),分類表(biao),這些(xie)都可以做成單(dan)表(biao)一(yi)對(dui)多(duo)關(guan)系(xi),而這些(xie)表(biao)做成一(yi)對(dui)多(duo)關(guan)系(xi)后,如果通過EntityFramework進行插(cha)入操作(zuo)時,會(hui)很方便,EF會(hui)自動為(wei)我們確實上級ID,對(dui)于操作(zuo)的性(xing)能(neng)也是可以接受的,與數(shu)據庫建(jian)立一(yi)次鏈接,發(fa)(fa)一(yi)批指定(ding),這是我們可以接受的,雖然在性(xing)能(neng)上不是最佳(jia)的,但綜(zong)合對(dui)比(bi)來看,它即是最佳(jia)的。(結合對(dui)比(bi)=程序性(xing)能(neng)+開發(fa)(fa)人員工時+程序擴展性(xing)+程序可讀性(xing))
OK,我們(men)以菜單表為(wei)例,說一下這個菜單表初始化(hua)的過(guo)程(cheng)
對于菜單實(shi)體(ti)的賦值(zhi),看(kan)一下代碼:
var menu = new WebManageMenus { About = string.Empty, LinkUrl = string.Empty, MenuLevel = 0, MenuName = form["MenuName"] ?? "根", Operator = string.Empty, ParentID = null, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now, WebManageMenus1 = new List<WebManageMenus> { new WebManageMenus { About = string.Empty, LinkUrl = string.Empty, MenuLevel = 1, MenuName ="系統管理", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now, WebManageMenus1 = new List<WebManageMenus> { #region 二級菜單 new WebManageMenus { About = string.Empty, LinkUrl = string.Empty, MenuLevel = 2, MenuName ="角色管理", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now, WebManageMenus1 = new List<WebManageMenus> { new WebManageMenus { About = string.Empty, LinkUrl = "/Role/Create", MenuLevel = 3, MenuName ="新建(jian)角色", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now }, new WebManageMenus { About = string.Empty, LinkUrl = "/Role/Index", MenuLevel = 3, MenuName ="管理角色(se)", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now } } }, #endregion #region 二級菜單 new WebManageMenus { About = string.Empty, LinkUrl = string.Empty, MenuLevel = 2, MenuName ="部門管(guan)理", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now, WebManageMenus1 = new List<WebManageMenus> { new WebManageMenus { About = string.Empty, LinkUrl = "/Department/Index", MenuLevel = 3, MenuName ="管理部門", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now } } }, #endregion #region 二級菜單 new WebManageMenus { About = string.Empty, LinkUrl = string.Empty, MenuLevel = 2, MenuName ="菜單管(guan)理", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now, WebManageMenus1 = new List<WebManageMenus> { new WebManageMenus { About = string.Empty, LinkUrl = "/Menu/Index", MenuLevel = 3, MenuName ="管理菜單管理", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now } } }, #endregion #region 二級菜單 new WebManageMenus { About = string.Empty, LinkUrl = string.Empty, MenuLevel = 2, MenuName ="員工管理", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now, WebManageMenus1 = new List<WebManageMenus> { new WebManageMenus { About = string.Empty, LinkUrl = "/User/Create", MenuLevel = 3, MenuName ="新建員工(gong)", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now }, new WebManageMenus { About = string.Empty, LinkUrl = "/User/Index", MenuLevel = 3, MenuName ="管理員工", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now } } }, #endregion } } } }; MenuRepository.Insert(menu);
我(wo)們可以看(kan)到,賦(fu)值的過程,我(wo)采用的EF生(sheng)成的實體標準,對于子對象的賦(fu)值,我(wo)們可以看(kan)到,parentID并沒(mei)有賦(fu)值,因為(wei)這時它還沒(mei)不存在,這個(ge)parentID為(wei)上級
菜(cai)單的(de)主鍵ID,所以EF在插入完父(fu)菜(cai)單后,會自(zi)動將ID賦值子對(dui)象的(de)ParentID,這個過程是系統幫我(wo)們(men)完成的(de)。
對于上面的過程,所生成的SQL語句也是我們可以接(jie)受的
感(gan)謝(xie)您(nin)的閱讀,感(gan)謝(xie)Entity Framework開發團隊!