Entity Framework Code First — многие ко многим с одним классом

У меня есть поставщик меню навигации, который я пытаюсь перенести на EF Code First (EF4, CPT5) с помощью объекта MenuItem. Это скорее упражнение для того, чтобы привыкнуть к построению различных отношений с EF Code First, чем к чему-либо еще.

В моем MenuItem есть поле SubMenuItems, которое представляет собой набор элементов MenuItem. Когда я использую EF Code First (без изменения классов), таблица, созданная для MenuItems, добавляет столбец для родительского элемента меню. Меню будет отображаться правильно, но это лишает возможности отображать элемент меню более чем в одном подменю. Как правильно сообщить EF Code First, что я хочу, чтобы каждый элемент меню был отдельным элементом, и создать другую таблицу, которая связывает элементы подменю элемента меню с другими элементами меню?

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. Я уверен, что просто «делаю это неправильно».

Спасибо!


person Jim D'Angelo    schedule 19.02.2011    source источник


Ответы (1)


Вам необходимо настроить связь «многие ко многим» для объекта MenuItem, чтобы каждый элемент меню мог иметь несколько родительских элементов:

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

}
person Morteza Manavi    schedule 19.02.2011
comment
Я думал, что уже сделал это, но, видимо, я что-то напутал. Большое спасибо, получилось отлично! - person Jim D'Angelo; 20.02.2011
comment
и если ваша таблица соединений имеет разные имена столбцов/таблиц -- stackoverflow.com/a/12331031/1037948 - person drzaus; 13.06.2013
comment
Этот метод должен быть добавлен в ваш класс, унаследованный от DbContext. В EF6 параметр должен иметь тип DbModelBuilder. - person Peppe L-G; 05.09.2015