2017-01-20 2 views
2

Я пытаюсь преобразовать это Tutorial, чтобы прочитать данные из таблицы. Я изменил модель NavigationMenu.cs путем добавления ключевого поля Id:Из модели с жесткой кодировкой в ​​управляемое данными меню

public class NavigationMenu 
{ 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public string Text { get; set; } 
    public string Action { get; set; } 
    public string Controller { get; set; } 
    public string Icon { get; set; } 
    public bool Selected { get; set; } 

    public List<NavigationMenu> MenuChildren; 

} 

добавил контекст:

public class NavigationMenuContext : DbContext 
{ 

    public NavigationMenuContext() : base("name=DefaultConnection") 
    { 
    } 

    public DbSet<NavigationMenu> NavigationMenus { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     base.OnModelCreating(modelBuilder); 
    } 
} 

и модифицировал конкретный контроллер:

public class NavigationController : Controller 
{ 

    // GET: NewMenu 
    public ActionResult Index() 
    { 
     NavigationMenuContext navigationMenuContext = new NavigationMenuContext(); 
     List<NavigationMenu> menuItems = navigationMenuContext.NavigationMenus.ToList(); 
     return View(menuItems); 
    }  

    [ChildActionOnly] 
    public ActionResult GenerateMenu() 
    { 

     NavigationMenuContext navigationMenuContext = new NavigationMenuContext(); 
     List<NavigationMenu> menuItems = navigationMenuContext.NavigationMenus.ToList(); 

     string action = ControllerContext.ParentActionViewContext.RouteData.Values["action"].ToString() == "Index" ? "" : ControllerContext.ParentActionViewContext.RouteData.Values["action"].ToString(); 
     string controller = ControllerContext.ParentActionViewContext.RouteData.Values["controller"].ToString(); 

     foreach (var item in menuItems) 
     { 
      if (item.MenuChildren != null) 
      { 
       foreach (var cItem in item.MenuChildren) 
       { 
        if (cItem.Controller == controller && cItem.Action == action) 
        { 
         cItem.Selected = true; 
         break; 
        } 
        else 
        { 
         cItem.Selected = false; 
        } 
       } 
      } 
      if (item.Controller == controller && item.Action == action) 
      { 
       item.Selected = true; 
       break; 
      } 
      else 
      { 
       item.Selected = false; 
      } 
     } 

     return PartialView("~/Views/Shared/_Navigation.cshtml", menuItems); 
    } 

} 

Но я не являюсь способный получить тот же результат с помощью меню второго уровня: NavigationMenus Table

Как изменить код для отображения второго уровня menù в представлении?

+0

Как MenuChildren недвижимость заселяется? В таблице базы данных все пункты меню выглядят на одном уровне? Как они имеют родительские отношения с ребенком? У вас должен быть столбец parentMenuId в таблице, который укажет, кто является родительским элементом меню. Если parentMenuId равно 0 или null, то это можно рассматривать как меню верхнего уровня. Также вам необходимо изменить привязку EF, измененную для поддержки отношений One-Many. –

+0

, пожалуйста, проверьте мой ответ, надеюсь, это поможет вам –

ответ

0
Hi this is the way you can achive what you want to do . I just added a line on OnMidelCreating and then testted the code woith 

    var result = context.MaineMenu.ToList(); // here I gold child menus in the list 


public class NavigationMenuContext : DbContext 
{ 

public NavigationMenuContext() : base("name=DefaultConnection") 
{ 
} 

public DbSet<NavigationMenu> NavigationMenus { get; set; } 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    -- this is changed -- 
    modelBuilder.Entity<NavigationMenu>().HasMany(c => c.MenuChildren); 
} 
} 

--- после этого, когда я добавляю новую миграцию, миграция выглядит так. см. Новый столбец идентификатора и внешний ключ был добавлен EF.

public override void Up() 
    { 
     CreateTable(
      "dbo.NavigationMenus", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Text = c.String(), 
        Action = c.String(), 
        Controller = c.String(), 
        Icon = c.String(), 
        Selected = c.Boolean(nullable: false), 
        NavigationMenu_Id = c.Int(), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.NavigationMenus", t => t.NavigationMenu_Id) 
      .Index(t => t.NavigationMenu_Id); 

    } 

    public override void Down() 
    { 
     DropForeignKey("dbo.NavigationMenus", "NavigationMenu_Id", "dbo.NavigationMenus"); 
     DropIndex("dbo.NavigationMenus", new[] { "NavigationMenu_Id" }); 
     DropTable("dbo.NavigationMenus"); 
    } 

данных в SQL-сервере и выход из приложения

enter image description here

Классы -----

public class SampleDbContext : DbContext 
    { 
     public SampleDbContext() 
      : base("name=SampleDBConnection") 
     { 
      this.Configuration.LazyLoadingEnabled = false; 
     } 



     public DbSet<NavigationMenu> MaineMenu { get; set; } 



     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Candidate>().HasMany(t => t.SkillSets).WithMany(t => t.Candidates) 
       .Map(m => 
       { 
        m.ToTable("candidate_skillset"); 
        m.MapLeftKey("candidate_id"); 
        m.MapRightKey("skillset_id"); 
       }); 

      modelBuilder.Entity<SkillSet>().ToTable("skillset"); 
      modelBuilder.Entity<Candidate>().ToTable("candidate"); 

      modelBuilder.Entity<NavigationMenu>().HasMany(c => c.MenuChildren); 



     } 
    } 


    public class NavigationMenu 
    { 

     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int Id { get; set; } 

     public NavigationMenu() 
     { 
      MenuChildren = new Collection<NavigationMenu>(); 
     } 

     public string Text { get; set; } 
     public string Action { get; set; } 
     public string Controller { get; set; } 
     public string Icon { get; set; } 
     public bool Selected { get; set; } 


     public ICollection<NavigationMenu> MenuChildren { get; set; } 

    } 
+0

Как свойство MenuChidren будет инициализироваться из базы данных? Если посмотреть на структуру таблиц, совместно используемую пользователем, нет никакого способа, чтобы MenuChidren имел в ней какой-либо элемент. –

+0

привет @ChetanRanpariya, когда я добавляю эту строку в modelbuilder, тогда EF автоматически создает идентификатор, который затем создается как foriegnkey на таблице таким образом, вы можете прочитать дочерний элемент идентификатора участника. –

+0

@ChetanRanpariya добавил мою миграцию после этого изменения. Я собираюсь добавить данные таблицы и результат в консольном приложении. –