You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

查询代码优化与修复

原查询代码存在多处不合理设计:

  1. 手动调用OpenConnection()和CloseConnection()完全冗余,EF Core会自动管理连接生命周期
  2. ToList()会加载全表数据,性能低下,应直接在数据库层面过滤
  3. 方法返回类型为非可空LibDataModel,但异常时返回null,会引发编译警告或运行时问题
  4. 异常处理过于笼统,无法定位具体错误原因

修改后的查询方法

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:15:36