EF Core 5.0报Invalid object name错误:确认表存在却无法识别如何解决
排查解决方向
1. 修正数据库初始化逻辑
你原来在EF6中使用的Me.Database.SetInitializer(Of MyDbContext)(Nothing)作用是完全禁用数据库自动初始化,不会对现有库表做任何修改,适配直接对接现有数据库的场景。
你当前使用的Me.Database.EnsureCreated()逻辑和原有逻辑完全不符:该方法只会在数据库完全不存在时,按照你的实体映射创建库和表,只要库存在就不会做任何校验,也不会适配现有表结构。EF Core中不需要额外调用任何初始化方法,默认就不会自动修改库表结构,直接删除Me.Database.EnsureCreated()这行即可匹配原有逻辑。
2. 修复表映射配置
当前的表映射写法存在高频踩坑点:你将schema和表名写在同一个字符串传入ToTable方法,EF Core会把dbo.Store整体识别为表名,最终生成的SQL路径会变成[dbo].[dbo.Store],自然会提示对象不存在。正确的拆分写法如下:
Protected Overrides Sub OnModelCreating(ByVal mb As ModelBuilder) mb.Entity(Of Store)().ToTable("Store", "dbo") mb.Entity(Of StoreAttrib)().ToTable("Store_Attribute", "dbo") mb.Entity(Of GroupStore)().ToTable("Group_Store", "dbo") End Sub
3. 校验连接字符串有效性
- 打印实际读取到的连接字符串
configSection.GetSection("ConnectionString").Value,确认和原有.NET Framework版本使用的sqlConString完全一致,重点核对:- 数据库实例名、初始目录(Initial Catalog)是否指向正确的数据库
- 登录账号是否有权限访问对应schema下的表,账号默认schema是否为
dbo
- 输出程序运行时的
Environment.CurrentDirectory路径,确认是否正确读取到了目标appSettings.json文件,避免拿到其他环境的错误连接字符串。
4. 确认实际执行的SQL语句
在OnConfiguring方法中开启EF Core日志输出,查看报错前实际生成的SQL语句:
ob.UseSqlServer(configSection.GetSection("ConnectionString").Value) _ .LogTo(AddressOf Console.WriteLine, Microsoft.Extensions.Logging.LogLevel.Information)
如果输出的SQL中查询的表名、schema和实际数据库不一致,可直接定位是映射配置问题。
5. 其他兼容校验
- 确认使用的EF Core 5版本和当前SQL Server版本兼容,低于SQL Server 2016的版本需要额外做兼容配置
- 检查
OnModelCreating中是否配置了全局默认schema,覆盖了单表的schema配置 - 确认实体类的字段类型、主键配置和实际表结构完全匹配,部分字段映射错误也会触发类似的对象不存在报错
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

