使用C#和Entity Framework连接MySQL遇metadata及CodeFirst异常问题
解决MySQL EF连接的metadata错误与CodeFirst异常问题
我是C#新手,接手他人代码时,用8.0.32版本的MySql.Data和MySql.Data.EntityFramework连接MySQL数据库,遇到了两个棘手问题:
- 配置带metadata的连接字符串时,运行报错“option not supported 'metadata'”
- 移除metadata后,又抛出Entity Framework UnintentionalCodeFirstException异常,即使指定edmx路径的metadata也无法解决
数据库连接权限正常,其他软件能正常连接,相关配置和代码如下:
原连接字符串
<add name="defaultDb" connectionString="metadata=res://*/VitoriasModel.csdl|res://*/VitoriasModel.ssdl|res://*/VitoriasModel.msl;provider=MySql.Data.MySqlClient;provider connection string="SERVER=remoteconnection(I cant put the server number here);DATABASE=dbname;UID=username;PASSWORD=password "" providerName="MySql.Data.MySqlClient" />
移除metadata后的连接字符串
<add name="defaultDb" connectionString="SERVER=remoteconnection(I cant put the server number here);DATABASE=dbname;UID=username;PASSWORD=password;" providerName="MySql.Data.MySqlClient" />
DbContext代码
public partial class vitoriasExample : DbContext { public vitoriasExample() : base("name=defaultDb") {} }
解决方案
修正连接字符串的ProviderName
带metadata的连接字符串是EF6模型优先/数据库优先模式的专用格式,原配置里providerName设为MySql.Data.MySqlClient是错误的,应该改为System.Data.EntityClient。同时确保metadata路径正确,如果edmx有命名空间,要替换res://*/为完整命名空间路径,比如res://*/YourProject.Models.VitoriasModel.csdl。修正后的连接字符串示例:<add name="defaultDb" connectionString="metadata=res://*/VitoriasModel.csdl|res://*/VitoriasModel.ssdl|res://*/VitoriasModel.msl;provider=MySql.Data.MySqlClient;provider connection string="SERVER=你的服务器地址;DATABASE=dbname;UID=username;PASSWORD=password;SslMode=Required"" providerName="System.Data.EntityClient" />确保EF版本与驱动兼容
MySql.Data.EntityFramework 8.0.x适配的是EF6,不是EF Core。检查项目是否安装了6.x版本的EntityFrameworkNuGet包,且DbContext继承的是System.Data.Entity.DbContext。验证EDMX文件配置
- 确认项目中存在VitoriasModel.edmx文件,右键该文件→属性→将“生成操作”设为“嵌入的资源”,确保元数据文件被正确嵌入程序集。
- 检查DbContext构造函数中的连接字符串名称
defaultDb,是否与配置文件中的name属性完全一致。
添加SSL连接参数
新版本MySQL驱动默认要求SSL连接,在连接字符串的provider部分加上SslMode=Required,避免连接失败。
内容的提问来源于stack exchange,提问作者vitoriac
相关产品推荐
相关产品推荐

