实体框架代码优先 - 单个类的多对多

时间:2011-02-19 18:02:36

标签: entity-framework code-first ef-code-first

我有一个导航菜单提供程序,我正在尝试使用MenuItem对象转移到EF Code First(EF4,CPT5)。对于与EF Code First建立不同关系而言,这更像是一种练习,而不是其他任何关系。

我的MenuItem有一个名为SubMenuItems的字段,它是MenuItems的集合。当我使用EF Code First(不修改类)时,为MenuItems创建的表为父菜单项添加了一列。菜单将正确显示,但这将删除任何菜单项出现在多个子菜单中的功能。告诉EF Code First我想让每个MenuItem成为一个独立的项目并创建另一个将菜单项的SubMenuItems链接到其他MenuItems的表格的正确方法是什么?

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; }
    ...
}

我试图覆盖OnModelCreating,但是每次尝试都被破坏或完成与它完全相同的事情而没有触及OnModelCreating。我敢肯定我只是“做错了。”

谢谢!

1 个答案:

答案 0 :(得分:3)

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

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

}