.NET Framework 4.5.2+EF6配置MSSQL、MySQL双数据库报错如何解决?
报错根本原因
你使用的8.x版本MySql.Data与EF6的兼容性存在问题,8.x系列的MySQL驱动核心适配方向是EF Core,自带的配置类未继承EF6要求的System.Data.Entity.DbConfiguration,才会触发该报错,按以下步骤修改即可完成双数据库配置:
第一步:修正NuGet包引用
- 卸载项目中现有的
MySql.Data、MySql.Data.Entity.EF6包 - 安装稳定兼容版本:
MySql.Data.EntityFramework6.10.9(该版本是官方最后一个针对.NET Framework 4.5.2 + EF6优化的稳定版,不会影响现有MSSQL的配置逻辑) - 保留原有的EF6相关包不变
第二步:修正app.config配置
替换原有对应节点内容,修正后的完整配置如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.10.9.0" newVersion="6.10.9.0" /> </dependentAssembly> </assemblyBinding> </runtime> <entityFramework> <providers> <!-- 保留原有MSSQL驱动配置 --> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <!-- 新增修正后的MySQL驱动配置 --> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework" /> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="MySql.Data.MySqlClient"></remove> <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> <!-- 新增两个数据库的连接字符串配置 --> <connectionStrings> <add name="MssqlDbContext" connectionString="你的MSSQL连接字符串" providerName="System.Data.SqlClient" /> <add name="MysqlDbContext" connectionString="server=MySQL地址;port=3306;database=库名;uid=账号;pwd=密码;CharSet=utf8mb4;Allow User Variables=True" providerName="MySql.Data.MySqlClient" /> </connectionStrings> </configuration>
第三步:配置双数据库上下文
分别创建独立的上下文类避免配置冲突:
- 原有MSSQL的上下文保持现有写法不变,无需修改
- 新增MySQL专属上下文,写法如下:
using System.Data.Entity; using MySql.Data.EntityFramework; // 绑定MySQL专属EF配置 [DbConfigurationType(typeof(MySqlEFConfiguration))] public class MysqlDbContext : DbContext { public MysqlDbContext() : base("name=MysqlDbContext") { // 不需要EF自动维护表结构的话可以加上这行 Database.SetInitializer<MysqlDbContext>(null); } // 配置MySQL表对应的实体集合 public DbSet<你的实体类> 对应属性名 { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 可选:统一将表名映射为小写,避免MySQL大小写敏感导致的表找不到问题 modelBuilder.Types().Configure(c => c.ToTable(c.ClrType.Name.ToLower())); } }
第四步:验证配置
分别实例化两个上下文执行简单的读写测试,确认两个数据库都可以正常操作即可。
内容的提问来源于stack exchange,提问作者Steven Yu
相关产品推荐
相关产品推荐

