首页 > 解决方案 > 如何通过 asp.net core signalR 从 SQL Server 数据库中获取用户(学生)?

问题描述

我需要从数据库中获取所有学生并在 signalR Hub 类中返回列表,但是每次我得到 null 而不是那个列表并且不知道为什么时,我尝试了很多方法来获取该列表,但它们都不起作用,可以请任何人帮助我;(我正在使用asp net core,并且我已经调试了我的应用程序,一切正常,但我得到NULL而不是列表

namespace Student_Training.SignalR
{

[Authorize]
public class ChatHub : Hub
{
private readonly TrainingDbContext _context;
private readonly UserManager<IdentityUser> _userManager;
private readonly ApplicationDbContext _Identitycontext; 

    

    public ChatHub(TrainingDbContext context, UserManager<IdentityUser> userManager, ApplicationDbContext Identitycontext)
    {
        _context = context;
        _userManager = userManager;
        _Identitycontext = Identitycontext;
    }

    
    public override Task OnConnectedAsync()
    {
        Clients.All.SendAsync("BroadcastConnections", LstAllConnections);
        ConnectedUser.Ids.Add(Context.ConnectionId);
        return base.OnConnectedAsync();
    }
    public override Task OnDisconnectedAsync(Exception exception)
    {
        ConnectedUser.Ids.Remove(Context.ConnectionId);
        return base.OnDisconnectedAsync(exception);
    }
    

    public async Task GetUsersToChat()
    {
        // Here we bring list of users
        
        // First Way
        var students  = await _context.Student.Include(s => s.AcademicSupervisor).Include(s => s.Faculty).Include(s => s.Major).Include(s => s.OrganizationSupervisor).ToListAsync();

        // Second Way by Service
        List<Student> users = new UsersListService().GetUsersToChat();

        await Clients.All.SendAsync("BroadcastUsersToChat", students);
    }



}

}

这是用户列表服务:

namespace Student_Training.Services
 {
    public class UsersListService
    {

    private readonly TrainingDbContext _context;
    private readonly UserManager<IdentityUser> _userManager;
    private readonly ApplicationDbContext _Identitycontext;

    public UsersListService()
    {
        _context = new TrainingDbContext();
    }
    // or list of identity user
    public List<Student> GetUsersToChat()
    {
        var students = _context.Student.Include(s => s.AcademicSupervisor).Include(s => s.Faculty).Include(s => s.Major).Include(s => s.OrganizationSupervisor);
        List<Student> studentslist = students.ToList();
        
        return studentslist;
    }
}

}

这是用户帐户(用户 ID、电子邮件、密码)的 IDENTITY DbContext

namespace Student_Training.Data
{
    public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}
}

这是包含 STUDENT 表的 DbContext:

    namespace Student_Training.Data
    {
    public partial class TrainingDbContext : DbContext
{
    public TrainingDbContext()
    {
    }

    public TrainingDbContext(DbContextOptions<TrainingDbContext> options)
        : base(options)
    {
    }

    public virtual DbSet<AcademicSupervisor> AcademicSupervisor { get; set; }
    public virtual DbSet<Faculty> Faculty { get; set; }
   
    public virtual DbSet<Major> Major { get; set; }
    public virtual DbSet<OrganizationSupervisor> OrganizationSupervisor { get; set; }

    public virtual DbSet<Student> Student { get; set; }

    public virtual DbSet<TrainingAdministrator> TrainingAdministrator { get; set; }
    public virtual DbSet<Message> Message { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {

            optionsBuilder.UseSqlServer("my-connection-string");
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AcademicSupervisor>(entity =>
        {
            entity.HasIndex(e => e.Email)
                .HasName("IX_AcademicSupervisorEmail")
                .IsUnique();

            entity.HasIndex(e => e.PhoneNumber)
                .HasName("IX_AcademicSupervisorPhoneNumber")
                .IsUnique();

            entity.HasOne(d => d.Faculty)
                .WithMany(p => p.AcademicSupervisor)
                .HasForeignKey(d => d.FacultyId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_AcademicSupervisor_Faculty");
        });

        

        modelBuilder.Entity<OrganizationSupervisor>(entity =>
        {
            entity.HasIndex(e => e.Email)
                .HasName("IX_OrganizationSupervisorEmail")
                .IsUnique();

            entity.HasIndex(e => e.PhoneNumber)
                .HasName("IX_OrganizationSupervisorPhoneNumber")
                .IsUnique();
        });

        modelBuilder.Entity<Student>(entity =>
        {
            entity.HasIndex(e => e.Email)
                .HasName("IX_StudentEmail")
                .IsUnique();

            entity.HasIndex(e => e.PhoneNumber)
                .HasName("IX_StudentPhoneNumber")
                .IsUnique();

            entity.HasOne(d => d.AcademicSupervisor)
                .WithMany(p => p.Student)
                .HasForeignKey(d => d.AcademicSupervisorId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Student_AcademicSupervisor");

            entity.HasOne(d => d.Faculty)
                .WithMany(p => p.Student)
                .HasForeignKey(d => d.FacultyId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Student_Faculty");

            entity.HasOne(d => d.Major)
                .WithMany(p => p.Student)
                .HasForeignKey(d => d.MajorId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Student_Major");

            entity.HasOne(d => d.OrganizationSupervisor)
                .WithMany(p => p.Student)
                .HasForeignKey(d => d.OrganizationSupervisorId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Student_OrganizationSupervisor");
        });

        modelBuilder.Entity<TrainingAdministrator>(entity =>
        {
            entity.HasKey(e => e.AdministratorId)
                .HasName("PK_TrainingAdminstrator");

            entity.HasIndex(e => e.Email)
                .HasName("IX_TrainingAdministratorEmail")
                .IsUnique();

            entity.HasIndex(e => e.PhoneNumber)
                .HasName("IX_TrainingAdministratorPhoneNumber")
                .IsUnique();

            entity.HasOne(d => d.Faculty)
                .WithMany(p => p.TrainingAdministrator)
                .HasForeignKey(d => d.FacultyId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_TrainingAdminstrator_Faculty");
        });
        modelBuilder.Entity<Message>(entity =>
        {
            entity.Property(e => e.MsgId).ValueGeneratedNever();

            entity.HasOne(d => d.AcaSender)
                .WithMany(p => p.Message)
                .HasForeignKey(d => d.UserId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Message_AcademicSupervisor");

            entity.HasOne(d => d.AdminSender)
                .WithMany(p => p.Message)
                .HasForeignKey(d => d.UserId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Message_TrainingAdminstrator");

            entity.HasOne(d => d.StudentSender)
                .WithMany(p => p.Message)
                .HasForeignKey(d => d.UserId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Message_Student");
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
}

创业班:

namespace Student_Training
{
     public class Startup
    {
        public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

  
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("DefaultConnection")));


        services.AddIdentity<IdentityUser, IdentityRole>()
        .AddDefaultTokenProviders()
        .AddDefaultUI()
        .AddEntityFrameworkStores<ApplicationDbContext>();
    
        
        services.Configure<IdentityOptions>(options =>
        {
            
            options.Password.RequireDigit = true;
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
            options.User.RequireUniqueEmail = true;
        });

        services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

            options.LoginPath = "/Identity/Account/Login";
            options.AccessDeniedPath = "/Identity/Account/AccessDenied";
            options.SlidingExpiration = true;
        });

        services.AddControllersWithViews();
        services.AddRazorPages(options =>
        {
            options.Conventions.AuthorizePage("/Students/StudentInfo/");
            options.Conventions.AuthorizeFolder("/Private");
        });

      
        services.AddDbContext<TrainingDbContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection2"));
            options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
        });
            
            
       services.AddAuthorization(options =>
        {
            options.FallbackPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
        });
       
        services.AddSignalR();
    }

   
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
           
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication(); 
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
            endpoints.MapHub<ChatHub>("/chatHub");
        });
    }
}
}

标签: c#asp.net-coresignalrsignalr-hubasp.net-core-signalr

解决方案


推荐阅读