Эф ядро ​​многие ко многим отношения внутри общего хранилища - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь найти работу со связями «многие ко многим» в своем веб-приложении. Я использую базовый код репозитория.

Вот мои сущности

public class UserEntity : BaseEntity<int>
{
    public string EmployeeId { get; set; }
    public string FullName { get; set; }
    public string Email { get; set; }

    public virtual ICollection<UserRoleEntity> UserRoles { get; set; }
}

public class RoleEntity : BaseEntity<int>
{
    public string Name { get; set; }

    public virtual ICollection<UserRoleEntity> Users { get; set; }
}

public class UserRoleEntity : BaseEntity<Guid>
{
    public int UserId { get; set; }
    public int RoleId { get; set; }

    public virtual UserEntity UserEntity { get; set; }
    public virtual RoleEntity RoleEntity { get; set; }
}

Это конфигурация контекстной модели

private void ConfigureUserRole(EntityTypeBuilder<UserRoleEntity> builder)
{
    builder.ToTable("UserRole");

    //there is no need for a surrogate key on many-to-many mapping table
    builder.Ignore("Id");

    builder.HasKey(ur => new { ur.RoleId, ur.UserId });

    builder.HasOne(ur => ur.RoleEntity)
        .WithMany(r => r.Users)
        .HasForeignKey(ur => ur.RoleId);

    builder.HasOne(ur => ur.UserEntity)
        .WithMany(u => u.UserRoles)
        .HasForeignKey(ur => ur.UserId);
}

Это основной метод get моего универсального репозитория (на самом деле это Крис Пратт , реализация ) Обратите внимание на строку query.Include, методы get универсального репозитория. используйте Include API EF Core для получения зависимой сущности, являющейся строковым параметром.

 protected virtual IQueryable<T> GetQueryable(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
                                                    string includeProperties = null,
                                                    int? skip = null,
                                                    int? take = null)
        {
            includeProperties = includeProperties ?? string.Empty;
            IQueryable<T> query = _dbContext.Set<T>();

            if (filter != null)
            {
                query = query.Where(filter);
            }

            foreach (var includeProperty in includeProperties.Split
                (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
            {
                query = query.Include(includeProperty);
            }

            if (orderBy != null)
            {
                query = orderBy(query);
            }

            if (skip.HasValue)
            {
                query = query.Skip(skip.Value);
            }

            if (take.HasValue)
            {
                query = query.Take(take.Value);
            }

            return query;
        }

И в моем сервисе я хочу получить пользовательские данные с полными зависимостями.

public class UserService : IUserService
{
    private IRepository<UserEntity> _userRepository;
    private IRepository<RoleEntity> _roleRepository;

    public UserService(IRepository<UserEntity> userRepository, IRepository<RoleEntity> roleRepository)
    {
        _userRepository = userRepository;
        _roleRepository = roleRepository;
    }
    public UserEntity GetUserData(string employeeId)
    {
        var user = _userRepository.GetFirst(u => u.EmployeeId == employeeId, includeProperties: "UserRoles");
        //var roles = _roleRepository.GetAll().ToList();

        return user;
    }
}

Когда вышеуказанный сервисный код выполняется, я получаю пользователя с UserRole зависимым, однако, когда я проверяю UserRole s RoleEntity зависимого, который мне нужен, это null.

  • Как получить зависимые данные RoleEntity, просто изменив метод get универсального репозитория?

  • Во-вторых, строка, закомментированная в служебном коде (_roleRepository.GetAll()), когда она также выполняется, RoleEntity немедленно заполняется ее соответствующим значением. Как это происходит?

1 Ответ

0 голосов
/ 31 октября 2018

Ваш путь включения имеет только один переход от UserEntity до UserRoleEntity (через свойство UserRoles. Вам необходимо включить следующий шаг, чтобы убедиться, что вы также захватили RoleEntity. Для этого измените свой путь к UserRoles.RoleEntity, например:

var user = _userRepository.GetFirst(
    u => u.EmployeeId == employeeId, 
    includeProperties: "UserRoles.RoleEntity");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...