codefrist的菜单Model是单表-多对多(也就是每个model元素都可以有无限个子节点(List<菜单>)和父节点(List<菜单>))的关系,而且查询的时候还要去确定根节点和停止遍历子节点的属性,方便我递归出一个菜单列表,请问这个要怎么实现,我已经纠结很多天了,求大神帮忙?
首先理解上我觉得菜单就是一对多的关系,而不是多对多,一个节点有N个子节点,但它只有一个父节点。一对多的情况下,可以通过自连接来实现
public class Menu { public Menu() { Menus = new HashSet<Menu>(); } public int LayerCount { get; set; }//用来记录菜单是第几层 public virtual ICollection<Menu> Menus { get; set; } }
当然了,如果你的菜单真的是多对多,那就要手工建立一个表,MenuToMenu,记录menu的两个ID就可以了。
谢谢您的回答,需求确实是单表多对多
按照您说的,我应该新建一个关系Model,对吗?
这个关系里面因为是多对多,我弄了一个是否为最后一个节点(最后一个节点就是我武断的认为它就是最后一个叶子节点,其实它下面还可以有其他节点,比如说死循环,A-B,B-A)的属性,如果是最后一个节点,就不再继续遍历它下面的节点,直接return。
最后一个节点的属性应该放到关系Model里面,新增一个字段就可以了,但是我这样添加一条记录的时候,是不是同时要操作(关系和菜单)Model,才能实现添加,并且确定是否为最后一个节点。
还有一个就是根节点,我要如何确定哪一个是根节点?
菜单Model,和关系Model是如何建立联系的,可不可举个例子说明一下,非常感谢~
@枫叶染深秋: 多对多之间相互引用,这谁是头谁是尾这个问题超出我的能力范围了。。。。
建立关系就是再建立一个表,
public class MenuToMenu { [Key] public int ID { get; set; } public int MenuID1 { get; set; } public int MenuID2 { get; set; } }
@枫叶染深秋: 根节点可以这样查,MenuModel的ID在MenuToMenu.MenuID2中没有的,最后一个节点可以MenuModel的ID在MenuToMenu.MenuID1中没有的.
@happydaily: 虽然答案不是很满意,还是谢谢你~
这种递归菜单一般都是设计一张表 Id,Pid,Name 这种结果,就可以实现递归了。
你现在的问题在哪里?
就是我无法确定根节点和last节点
@枫叶染深秋: 根结点的PID用0,判断LAST节点得判断一下PID等于当前ID的COUNT这样。