如何从实体框架核心中获得多层次的2级深度实体?

时间:2020-03-14 09:00:07

标签: entity-framework-core many-to-many automapper

我正在开发具有授权的新Asp.Net Core API。 在我的授权中,用户可以具有多个角色。当然,一个角色可以有多个用户。

这是我的课程:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public ICollection<UserRole> Roles { get; set; }

    [NotMapped]
    public string Token { get; set; }
}

public class UserRole
{
    [JsonIgnore]
    public Guid UserId { get; set; }
    public User User { get; set; }

    public int RoleId { get; set; }
    public Role Role { get; set; }
}

public class Role
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Name { get; set; }
}

ApplicationDbContext:

        modelBuilder.Entity<UserRole>()
            .HasKey(bc => new { bc.UserId, bc.RoleId });
        modelBuilder.Entity<UserRole>()
            .HasOne(bc => bc.User)
            .WithMany(b => b.Roles)
            .HasForeignKey(bc => bc.UserId);

这一切正常,如果我想要一个用户,我可以得到3级深度的正确输出。但我想摆脱第二层。如果我想要一个用户,我想恢复一对多的关系。为此,我的UserDTO

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

    public ICollection<Role> Roles { get; set; }

    public string Token { get; set; }
}

注意:集合角色而不是用户角色

但是如何使用Entity Framework Core(3.1)或AutoMapper实现呢?

第二个问题。如果检索单个用户或用户列表,则只能得到2个级别的深度。但是,如果我要求首先检索所有用户角色,则会得到3个级别。但是我有2个电话。这应该是一个。

->这有效

    public async Task<IEnumerable<User>> GetAll()
    {
        var ur = await _context.UserRoles.Include(ur => ur.Role).Include(ur => ur.User).ToListAsync();
        var users = await _context.Users
            .Include(users => users.Roles)
            .ToListAsync();
        return users;
    }

->这不是

    public async Task<IEnumerable<User>> GetAll()
    {
        var users = await _context.Users
            .Include(users => users.Roles)
            .ToListAsync();
        return users;
    }

这些是我的序列化选项:

        services.AddControllers().AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
        });

0 个答案:

没有答案