WPF中使用EF Core无法读取数据库表数据的问题求助
问题分析与解决方案
核心问题:DbSet定义错误
你的DbsDataModel中,DbSet是字段而非属性(缺少getter/setter),EF Core无法正确识别这些集合,导致生成SQL时无法找到表名,抛出Value cannot be null - table_name异常。注册系统能工作可能是因为注册逻辑未直接依赖这些DbSet字段,或是有临时替代逻辑。
修改后的DbContext代码
internal class DbsDataModel : DbContext { private const string connectionString = "Server=Serv;Database=DbLibraryManager;Trusted_Connection=true;"; // 将字段改为带getter/setter的属性,初始化避免空引用 public DbSet<LibDataModel> Libraries { get; set; } = null!; public DbSet<Admin> Admins { get; set; } = null!; public DbSet<Worker> Workers { get; set; } = null!; public DbSet<User> Users { get; set; } = null!; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(connectionString); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<LibDataModel>() .ToTable("libraries", x => x.ExcludeFromMigrations()).HasKey(x => x.Id); modelBuilder.Entity<Admin>().ToTable("Admins").HasKey(x => x.Id); modelBuilder.Entity<Worker>().ToTable("Workers").HasKey(x => x.Id); modelBuilder.Entity<User>().ToTable("Users").HasKey(x => x.Id); modelBuilder.Entity<LibDataModel>().HasMany(x => x.Admins).WithOne(x => x.Library); modelBuilder.Entity<LibDataModel>().HasMany(x => x.Workers).WithOne(x => x.Library); modelBuilder.Entity<LibDataModel>().HasMany(x => x.Users).WithOne(x => x.Library); base.OnModelCreating(modelBuilder); } }
查询代码优化与修复
原查询代码存在多处不合理设计:
- 手动调用
OpenConnection()和CloseConnection()完全冗余,EF Core会自动管理连接生命周期 ToList()会加载全表数据,性能低下,应直接在数据库层面过滤- 方法返回类型为非可空
LibDataModel,但异常时返回null,会引发编译警告或运行时问题 - 异常处理过于笼统,无法定位具体错误原因
修改后的查询方法
public static LibDataModel? ReturnLibraryWithThisNip(int nip) { try { using (var dataContext = new DbsDataModel()) { // 直接在数据库层面过滤,避免全表加载 return dataContext.Libraries.FirstOrDefault(x => x.NipNumber == nip); } } catch (Exception ex) { // 可添加日志记录,方便后续排查问题 Console.WriteLine($"查询失败: {ex.Message}"); return null; } }
额外检查点
- 确认
LibDataModel类的NipNumber属性与数据库表libraries的对应列名称、数据类型完全匹配 - 检查连接字符串中的服务器名称
Serv是否正确(可通过SSMS测试连接验证) - 确保程序运行账号拥有
DbLibraryManager数据库的访问权限
内容的提问来源于stack exchange,提问作者Giusek keisuG
相关产品推荐
相关产品推荐

