Связь Many-to-Many c 3 сущностями одновременно в EF Core

Всем привет. Столкнулся с такой проблемой что нет уверенности в правильности составленной схемы сущностей (связей) в БД. Суть заключается в следующем планирую разработать сервис для предприятий которые смогут оперативно отвечать на интересующий вопросы клиентов. Нужно правильно организовать связь сущностей в БД. Будет реализована RBAC (ролевая) модель управление доступа в рамках одного конкретного предприятия, т.е. пользователь может быть в разных организациях и у каждой организации у данного пользователя будут свои уникальные роли в рамках этого предприятия. Также в рамках предприятия пользователь может быть включен в список конкретных команд (UserTeam связь many-to-many) или может быть заблокирован для доступа в конкретную организацию суперпользователем (BlockUsers связь many-to-many).

Сущность UserOrganizationRole и OrganizationRolePermission получают связь сразу с тремя сущностями т.к. необходимо понимать что у конкретного пользователя в конкретной организации есть определенный набор Ролей, и также соответственно у каждой роли в конкретной организации будут определенный набор разрешений (permissions).

Сложность данной схемы обусловлена тем что пользователь может с течением времени уйти из одной компании в другую и для того чтобы ему не пришлось заводить новый аккаунт для включение в новую компанию была реализована связь сразу с 3 сущностями. Получается в старой компании пользователя добавят в список “заблокированных пользователей” суперпользователем старой компании а в новой компании суперпользователь добавить его список сотрудников и добавит соответствующую роль пользователя.

Хотелось бы получить совет (рекомендацию) по следующим вопросам:

  1. Не сильно ли перемудрил здесь, может есть более простое решение?
  2. Будет ли это потом сложно поддерживать?
  3. Есть ли возможность реализовать получение сущностей ролей у конкретного пользователя для конкретного предприятия через EF Core? (т.к. в большинстве примеров в интернете натыкался только на применение связей many-to-many, но найти примеры связей many-to-many с тремя сущностями не смог)

введите сюда описание изображения

Проблему еще кроется в том что не очень удобно будет получать полномочия у пользователя в конкретной компании т.к. нужно вызывать несколько функций в репозитори.

List<Role> GetUserRoleInCompany(Guid userId, Guid companyId) {
    return _dbContext.UserCompanyRoles
        .Include(u => u.Role)
        .Where(u => u.UserId == userId && u.CompanyId == companyId)
        .Select(u => u.Role)
        .ToList();
}

List<Permission> GetUserPermissionInCompany(List<int> roleIds, Guid compnayId)
{
    return _dbContext.CompanyRolePermissions
        .Include(p => p.Permission)
        .Where(u => u.CompanyId == CompanyId && roleIds.Contains(u.RoleId))
        .Select(u => u.Permission)
        .ToList();
}

При условии что схема сущностей будет такой

public class User
{
    public Guid Id { get; set; }

    public ICollection<Role> Roles { get; set; } = []; // unknown which roles link to what company
}

public class Company { public Guid Id { get; set; } }

public class Role { public int Id { get; set; } }

public class UserCompanyRole // 3 tables (many-to-many)
{
    public Guid UserId { get; set; }
    public Guid CompanyId { get; set; }
    public int RoleId { get; set; }

    public User User { get; set; }
    public Company Company { get; set; }
    public Role Role { get; set; }
}

В идеале было бы удобно получать роли и связанные с ней полномочия в конкретной компании через принципы DDD (например через какое-либо свойства класса в User). При связи 3 сущностей не получится использовать свойство Roles у сущности User


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