Реализация объединения таблиц many-to-many в asp.net core

Есть таблица Menu, который содержит в себе Роли, для которых это меню может показываться

public class Menu : BaseEntity, IAggregateRoot
{
    public string Name { get; set; }
    public int? Priority { get; set; }
    public virtual IEnumerable<MenuRole> Roles { get; set; }
}

Так же есть таблица Role, расширяющий основную модель роли добавляя туда список Menu

public class Role : IdentityRole
{
    public virtual IEnumerable<MenuRole> Menu { get; set; }
}

И есть объединяющая таблица

public class MenuRole
{
    public int MenuId { get; set; }
    public virtual Menu Menu { get; set; }

    public string RoleId { get; set; }
    public virtual Role Role { get; set; }
}

Я помню, что раньше в ЕF можно было не создавать доп. таблицу, она автоматически формировалась при миграции в БД, сейчас же она нужна, и по этому добавляются лишние переходы при получении Ролей:

Menu.Roles.Select(x=> x.Role...) 

Можно ли как ни будь смапить или сформировать данные пришедшие с БД сразу в список IEnumerable < Role > и пропускать эту таблицу из выборки?


Ответы (1 шт):

Автор решения: kurtov

Если вы используете Entity Framework Core, то такая возможность появилась в 5 версии. На данный момент доступен второй релиз кандидат и по заверения Microsoft он готов для использования на боевой среде. Достаточно будет описать модель следующим образом:

public class Menu : BaseEntity, IAggregateRoot
{
    public string Name { get; set; }
    public int? Priority { get; set; }
    public virtual IEnumerable<Role> Roles { get; set; }
}

public class Role : IdentityRole
{
    public virtual IEnumerable<Menu> Menu { get; set; }
}

Обновите ваши nugget пакеты EF Core до версии "5.0.0-rc.*", для более ранних версии EF Core, необходимо создавать объединяющую сущность модели.

Более подробно можно почитать здесь.

→ Ссылка