Entity Framework搭配MySQL时MissingManifestResourceException问题求助
这个System.Resources.MissingManifestResourceException在从MSSQL切换到MySQL的EF场景中很常见,核心原因是EF无法定位到对应的资源文件,或者数据库提供商的配置存在冲突。结合你的环境(VS2015、.NET4.5.2、EF6.2.0、MySql.Data.Entity.EF6 6.10.7),给你几个针对性的解决步骤:
检查并修正EF配置文件
确保web.config或app.config中的EF提供商和数据库工厂配置完全替换为MySQL的,移除原有的MSSQL相关配置:<!-- entityFramework节点配置 --> <entityFramework> <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" /> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" /> </providers> </entityFramework> <!-- system.data节点配置 --> <system.data> <DbProviderFactories> <remove invariant="MySql.Data.MySqlClient" /> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" /> </DbProviderFactories> </system.data>同时确认连接字符串的
providerName是MySql.Data.MySqlClient,而不是原来的System.Data.SqlClient。确保项目命名空间与资源文件匹配
EF会根据DbContext的命名空间查找对应的资源文件,检查你的DbContext类的命名空间是否和项目的默认命名空间一致。如果DbContext在子命名空间下(比如YourProject.Data),确保对应的.resx资源文件也在相同的命名空间下,且文件名与DbContext类名一致(比如YourDbContext.resx)。另外,右键资源文件查看属性,确认生成操作设为嵌入的资源,自定义工具设为ResXFileCodeGenerator。清理并重新生成解决方案
有时候旧的资源缓存会导致问题,先执行Build -> Clean Solution清理所有编译产物,再执行Build -> Rebuild Solution重新生成整个项目,确保所有资源文件都被正确嵌入到程序集中。重新初始化迁移(如果需要)
既然你已经删除了旧迁移文件和__MigrationHistory表,可以重新创建迁移:- 在包管理器控制台中选中包含DbContext的项目
- 执行命令:
Enable-Migrations -Force - 执行:
Add-Migration InitialCreate - 最后执行:
Update-Database
注意执行过程中如果有报错,检查连接字符串是否正确,以及MySQL服务是否正常运行。
重装MySQL EF驱动包
有时候NuGet包的安装可能存在损坏或依赖冲突,尝试卸载并重新安装相关包:Uninstall-Package MySql.Data.Entity.EF6 -Force Uninstall-Package MySql.Data -Force Install-Package MySql.Data.Entity.EF6 -Version 6.10.7安装完成后再次检查配置文件是否被正确更新。
检查DbContext构造函数
确保你的DbContext子类构造函数正确指向MySQL连接字符串,并且可以暂时禁用数据库初始化避免冲突:public class YourDbContext : DbContext { public YourDbContext() : base("name=YourMySqlConnection") { // 禁用自动初始化,避免迁移相关问题 Database.SetInitializer<YourDbContext>(null); } public DbSet<Language> Languages { get; set; } // 其他DbSet定义... }
如果以上步骤都无法解决问题,可以查看异常的详细堆栈信息,找到具体缺失的资源文件名,这样就能更精准地定位资源文件的命名或位置问题。
内容的提问来源于stack exchange,提问作者Péter Aradi

