簡體   English   中英

通用存儲庫中的 Ef 核心多對多關系

[英]Ef core many to many relationship inside a generic repository

我正在嘗試在我的 Web 應用程序中使用多對多關系。 我正在使用通用存儲庫基本代碼。

這是我的實體

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 方法(實際上它是Chris Pratt實現)請注意query.Include行,通用存儲庫的 get 方法利用 EF Core 的Include api 來獲取以字符串形式出現的依賴實體范圍 。

 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 ,但是,當我檢查我需要的UserRoleRoleEntity依賴時,它是null

  • 如何僅通過修改通用存儲庫的 get 方法來獲取依賴的RoleEntity數據?

  • 其次,服務代碼中注釋的行( _roleRepository.GetAll() ),當它也被執行時, RoleEntity會立即填充其正確的值。 它是如何發生的?

您的包含路徑只有從UserEntityUserRoleEntity的單跳(通過UserRoles屬性。您需要包含下一步以確保您也捕獲RoleEntity 。為此,請將您的路徑更改為UserRoles.RoleEntity ,例如:

var user = _userRepository.GetFirst(
    u => u.EmployeeId == employeeId, 
    includeProperties: "UserRoles.RoleEntity");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM