Entity framework 实体框架代码优先-具有单个类的多对多

Entity framework 实体框架代码优先-具有单个类的多对多,entity-framework,code-first,ef-code-first,Entity Framework,Code First,Ef Code First,我有一个导航菜单提供程序,我正试图使用一个MenuItem对象首先转到EF代码(EF4,CPT5)。这更像是一个练习,首先要熟悉与EF代码建立不同的关系 My MenuItem有一个名为SubNuItems的字段,它是MenuItems的集合。当我首先使用EF代码时(不修改类),为菜单项创建的表会为父菜单项添加一列。菜单将正确显示,但这将取消在多个子菜单中显示菜单项的功能。首先告诉EF代码我希望每个菜单项都是一个独立项,并创建另一个将菜单项的子菜单项链接到其他菜单项的表的正确方法是什么 publ

我有一个导航菜单提供程序,我正试图使用一个MenuItem对象首先转到EF代码(EF4,CPT5)。这更像是一个练习,首先要熟悉与EF代码建立不同的关系

My MenuItem有一个名为SubNuItems的字段,它是MenuItems的集合。当我首先使用EF代码时(不修改类),为菜单项创建的表会为父菜单项添加一列。菜单将正确显示,但这将取消在多个子菜单中显示菜单项的功能。首先告诉EF代码我希望每个菜单项都是一个独立项,并创建另一个将菜单项的子菜单项链接到其他菜单项的表的正确方法是什么

public class MenuItem
{
    public int ID { get; set; }
    public virtual SubMenuItems { get; set; }
    public string Text { get; set; }
    public string Controller { get; set; }
    public string Action { get; set; }
    public bool IsRoot { get; set; }
    public bool RequiresAuthentication { get; set; }
    public virtual ICollection<MenuPermission> RequiredPermissions { get; set; }
    public bool HiddenIfAuthenticated { get; set; }
    public int DisplayOrder { get; set; }
}

...

public class MyDbContext : DbContext
{
    public DbSet<MenuItems> MenuItems { get; set; }
    public DbSet<MenuItemPermission> MenuItemPermissions { get; set; }
    ...
}
公共类菜单项
{
公共int ID{get;set;}
公共虚拟子菜单项{get;set;}
公共字符串文本{get;set;}
公共字符串控制器{get;set;}
公共字符串操作{get;set;}
公共bool IsRoot{get;set;}
公共布尔要求重新验证{get;set;}
公共虚拟ICollection所需权限{get;set;}
公共bool HiddenIfAuthenticated{get;set;}
公共int显示顺序{get;set;}
}
...
公共类MyDbContext:DbContext
{
公共数据库集菜单项{get;set;}
公共DbSet MenuItemPermissions{get;set;}
...
}
我曾尝试覆盖OnModelCreating,但每次尝试都以被破坏或执行与未接触OnModelCreating时完全相同的操作而告终。我肯定我只是“做错了”


谢谢

您需要为
MenuItem
实体设置多对多自引用关联,以便每个MenuItem可以有多个父项:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MenuItem>()
                .HasMany(m => m.SubMenuItems)
                .WithMany();

}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasMany(m=>m.subnumitems)
.有许多();
}

我以为我已经这么做了,但我想我把事情搞砸了。非常感谢,这一切都很顺利!如果联接表具有不同的列/表名,则应将此方法添加到从
DbContext
继承的类中。在EF6中,参数的类型应为
DbModelBuilder