單表一對多關系很常見,它是一種樹形結構,如系統菜單表,部門表,分類表,這些都可以做成單表一對多關系,而這些表做成一對多關系后,如果通過EntityFramework進行插入操作時,會很方便,EF會自動為我們確實上級ID,對於操作的性能也是可以接受的,與數據庫建立一次鏈接,發一批指定,這是我們可以接受的,雖然在性能上不是最佳的,但綜合對比來看,它即是最佳的。(結合對比=程序性能+開發人員工時+程序擴展性+程序可讀性)
OK,我們以菜單表為例,說一下這個菜單表初始化的過程
對於菜單實體的賦值,看一下代碼:
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 ="新建角色", Operator = string.Empty, SortNumber = 1, Status = Status.Normal.GetHashCode(), UpdateDate = DateTime.Now }, new WebManageMenus { About = string.Empty, LinkUrl = "/Role/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 = "/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 ="菜單管理", 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 ="新建員工", 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);
我們可以看到,賦值的過程,我采用的EF生成的實體標准,對於子對象的賦值,我們可以看到,parentID並沒有賦值,因為這時它還沒不存在,這個parentID為上級
菜單的主鍵ID,所以EF在插入完父菜單后,會自動將ID賦值子對象的ParentID,這個過程是系統幫我們完成的。
對於上面的過程,所生成的SQL語句也是我們可以接受的
感謝您的閱讀,感謝Entity Framework開發團隊!