【问题标题】:Entity Framework Code First - Many-to-many with a single class实体框架代码优先 - 单一类的多对多
【发布时间】:2011-02-19 18:02:36
【问题描述】:

我有一个导航菜单提供程序,我正在尝试使用 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 的情况完全相同的事情告终。我确定我只是“做错了”。

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我以为我已经这样做了,但我想我搞砸了。非常感谢,效果很好!
    • 如果你的连接表有不同的列/表名 -- stackoverflow.com/a/12331031/1037948
    • 这个方法应该被添加到你继承自DbContext的类中。在 EF6 中,参数的类型应为 DbModelBuilder
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多