c# - 如何通过 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");
});
}
}
}
解决方案
推荐阅读
- reactjs - 由于缺少 CSRF 令牌,Django Rest 框架中的发布请求失败
- node.js - Kubernetes ECONNRESET nodejs
- data-visualization - Tableau 如何根据两个字段为图表着色,一个是连续的,另一个是离散的
- unity3d - unity调整大小布局
- python - 如果出现任何错误,Excel.exe 进程将继续运行
- xquery - Marklogic 提交帧/返回序列保证
- c++ - 应该使用什么类型的 C++ 类型转换来将指向结构的指针转换为它的第一个成员?
- android - 登录应用程序 - 仅读取我的数据库中的最后一个条目
- python - 解析大型 XML 文件时出现内存错误
- c++ - 无法将大括号括起来的初始值设定项列表转换为映射