Entity Framework Code First - многие-ко-многим с одним классом - PullRequest
3 голосов
/ 19 февраля 2011

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

Мой MenuItem имеет поле SubMenuItems, которое является коллекцией MenuItems. Когда я использую EF Code First (без изменения классов), таблица, созданная для MenuItems, добавляет столбец для родительского элемента меню. Меню будет отображаться правильно, но это исключает любую возможность появления пункта меню в нескольких подменю. Как правильно сообщить EF Code: во-первых, я хочу, чтобы каждый 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 Ответ

3 голосов
/ 20 февраля 2011

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

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

}
...