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
相关产品推荐
相关产品推荐

