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

VS中EF WinForm应用SQLite添加数据报错:找不到ProductModels表

解决SQLite Error 1: 'no such table: ProductModels' 异常问题

这个问题的核心是EF Core的实体映射和数据库实际表名不匹配,咱们一步步来搞定它:

问题根源

你提到启动项目后能看到Product和Category表,但代码里的DbSet命名是ProductModels和CategorieModels(还有个拼写错误:CategorieModels应该是CategoryModels)。EF Core默认会以DbSet的属性名作为数据库表名,所以当前代码会尝试操作ProductModels表,但你的数据库里实际是Product表,自然会抛出“找不到表”的异常。

具体解决方法

你可以根据自己的需求选择以下任意一种方案:

方案1:通过数据注解指定表名(推荐,适配现有数据库)

如果想保留已经生成的Product和Category表,直接在实体类上添加[Table]特性,强制指定映射的表名:

using System.ComponentModel.DataAnnotations.Schema; // 需要引入这个命名空间

[Table("Product")] // 明确指定映射到Product表
public class ProductModel {
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

[Table("Category")] // 明确指定映射到Category表
public class CategoryModel {
    public int Id { get; set; }
    public string Name { get; set; }
}

同时记得修正ShopContext里的拼写错误:

public class ShopContext : DbContext {
    public DbSet<ProductModel> ProductModels { get; set; }
    public DbSet<CategoryModel> CategoryModels { get; set; } // 把CategorieModels改成CategoryModels
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
        optionsBuilder.UseSqlite("Data Source=shop.db");
    }
}

方案2:修改DbSet名称适配默认约定

如果你想遵循EF Core的默认命名约定(DbSet名称对应表名),可以把DbSet的名称改成和数据库表名一致的形式:

public class ShopContext : DbContext {
    public DbSet<ProductModel> Products { get; set; } // 改成Products,对应数据库的Products表
    public DbSet<CategoryModel> Categories { get; set; } // 改成Categories,修正拼写
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
        optionsBuilder.UseSqlite("Data Source=shop.db");
    }
}

然后删除现有的shop.db文件,重启项目让EF重新生成符合约定的数据库表。

方案3:删除旧数据库,让EF重新生成

如果你不需要保留现有数据库的数据,直接删除项目目录下的shop.db文件,然后在窗体启动时确保数据库被创建:
在Form1的构造函数里添加:

public Form1() {
    InitializeComponent();
    // 确保数据库在启动时自动创建
    using (var db = new ShopContext())
    {
        db.Database.EnsureCreated();
    }
}

重启项目后,EF会根据当前代码生成ProductModels和修正后的CategoryModels表,此时调用AddProduct方法就不会报错了。

额外注意事项

  • 始终保持DbSet命名和实体映射的表名一致,或者通过特性/Fluent API明确指定映射关系,避免类似的不匹配问题。
  • 检查代码中的拼写错误(比如CategorieModels),这类小错误很容易导致隐藏的映射问题。

内容的提问来源于stack exchange,提问作者sha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:24:40