多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

免安装MySQL驱动的工程实践:mysql-connector-net-6.8.3 noinstall完全指南

免安装MySQL驱动的工程实践:mysql-connector-net-6.8.3 noinstall完全指南 简介MySQL Connector/Net 6.8.3 免安装版是 MySQL 官方面向 .NET 开发人员推出的数据库驱动程序能帮助使用 C#、VB.NET 等语言的开发者顺畅连接 MySQL 服务器。该版本无需安装解压即可部署便于在多套环境中快速迁移与离线集成。压缩包共 21 个文件大小仅 3.45MB主体为 13 个动态链接库文件覆盖 .NET 2.0、4.0、4.5 及 Entity Framework 5/6 等不同目标框架另附编译后的 CHM 帮助手册、开源许可证页面与使用说明文档。通过这些文档开发者可以查看版本变更记录、了解手动配置步骤、查阅接口用法并确认授权条款从而安全高效地将数据库操作集成到项目中。目前已有 280 人学习下载适合需要快速获取官方驱动并适配多种 .NET 版本的项目开发人员。1. mysql-connector-net-6.8.3-noinstall.zip 是给谁的没有管理员权限也能把 MySQL 驱动装进项目的 zip 包mysql-connector-net-6.8.3-noinstall.zip 这名字老但解决的恰恰是最现实的问题生产服务器在隔离网络里没有外网也没有管理员权限还要给老项目补一个 MySQL 驱动。noinstall 是官方给的免安装分发形态不跑 MSI、不碰 GAC 和 machine.config解压出 dll 直接引用就能用。这篇不聊新功能只把这个 zip 包讲透哪个 dll 干什么、怎么引用跑通第一条查询、什么时候才需要手工注册全局、5 个高频坑怎么绕。适合正在维护 .NET Framework 4.x EF 5/6 老项目的人也适合做离线交付物、被安装包权限卡住的工程师。读完你手里的 zip 就不只是临时救急的压缩包而是可以固化成团队部署基座的东西。2. 拆开 noinstall 包先分清 dllMySql.Data 和 EF 程序集谁管什么事拿到这个 zip 的第一反应是解压第二反应通常是懵根目录散着四五个 dll还有 docs 和 samples到底引用哪个这一章先把包里的家底摸清楚再教你怎么用 PowerShell 自检 dll 的真实身份。这一步做扎实了后面注册配置才不会抄错版本号。2.1 解压后的结构与四个关键程序集docs、samples 与真正要引用的文件noinstall 包的典型布局是 docs 目录帮助文档、samples 目录示例代码加上根目录几个 dll 和一份许可文本。不同构建的目录组织略有差异但核心程序集就那么几个关键是把它们各自的职责记住。程序集职责什么时候引用MySql.Data.dllADO.NET 驱动核心连接、命令、DataReader 全在这里所有场景必引MySql.Data.Entity.dllEF 4/5 的集成层老项目用 EF5 时引MySql.Data.EntityFramework.dllEF 6 的集成层6.8 起单独提供用 EF6 时引MySql.Web.dllASP.NET 的 Membership / Role providerWebForms 老项目才需要先说几条实战经验。第一MySql.Data.dll 是全家桶其余全是围绕它的扩展层只跑原生 ADO.NET 的话引用一个文件就够。第二EF 那俩文件在部分构建里只有 MySql.Data.Entity.dll 一个名字也可能同时存在两个动手前先看解压目录别背文件名后面配置 provider 时文件名直接决定 type 字符串对不对。第三MySql.VisualStudio.dll 是给 Visual Studio 设计器用的部署和编译都不需要别复制进 bin 目录省得惹出版本冲突。我习惯把整个 zip 解压到项目的 vendor 目录而不是扔桌面目录名就叫 mysql-connector-net-6.8.3docs 和 samples 一起留着。理由很简单版本管理里能看出这个项目锁定了哪版驱动换版本只改目录不碰代码。docs 目录里的 HTML 帮助在断网排查时是救命的东西连接串参数的默认值、枚举值都在里面写着比在网上搜二手答案靠谱。2.2 用 PowerShell 读程序集元数据版本、强名称与目标框架一次看清noinstall 场景最忌讳抄配置。网上贴的 machine.config 片段里 PublicKeyToken 往往来自另一个版本抄过来就是一次翻车。正确做法是拿你手上这份 dll 实测PowerShell 几行命令就能把注册配置需要的三个信息全读出来。# 只读元数据不会触发依赖程序集加载安全 $dll (Resolve-Path .\MySql.Data.dll).Path $an [System.Reflection.AssemblyName]::GetAssemblyName($dll) $an | Format-List Name, Version, FullName # PublicKeyToken 是 byte 数组转成小写十六进制字符串才和配置里写法一致 $tokenHex ($an.GetPublicKeyToken() | ForEach-Object { $_.ToString(x2) }) -join PublicKeyToken$tokenHex # 目标运行时版本v4.0.30319 表示 .NET Framework 4.x $asm [System.Reflection.Assembly]::ReflectionOnlyLoadFrom($dll) $asm.ImageRuntimeVersion这里要解释两个关键点。第一GetAssemblyName只读清单不加载程序集所以即使目录里缺依赖文件也不会报错适合拿来核对交付物。第二GetPublicKeyToken的输出一定要转成小写十六进制否则后面填进 machine.config 的 type 字符串会格式对不上。6.8.3 这类官方构建的 token 通常是个固定值但如果 dll 被人重新编译过、或者从私有构建流出来的token 就会变。所以判断标准只有一个以你 dll 的实测输出为准网上任何人贴的 token 都只能当参考。还有一个隐藏坑FullName里的 Version 才是 CLR 解析时用的版本号不是你在文件属性里看到的文件版本。两者在个别构建里会不一致配置里永远填FullName里的那个版本号。2.3 6.8.3 的兼容边界.NET Framework 4.0、EF5/EF6 与新版驱动的取舍6.8.3 诞生在 .NET Framework 4.0/4.5 时代这个定位决定了很多事不能拿今天的新驱动标准去要求它。它没有完整的 async/await 支持异步走的是 BeginExecuteReader 那套老模式它对 MySQL 8.0 的 caching_sha2_password 认证也不认第 5 章细说但反过来如果你的项目锁定在 Framework 4.x它的表现非常稳定配置简单资料也多。选型上有几条边界值得记下来。第一纯 ADO.NET .NET Framework 4.x6.8.3 完全够用不用为新版更好去冒险升级。第二EF5 项目用 MySql.Data.Entity.dllEF6 项目用 MySql.Data.EntityFramework.dll并且大概率要处理 DbConfiguration 的注册第 4 章给方案。第三项目如果是 .NET Core / .NET 5不要碰 6.8.3直接换支持异步的新版驱动硬套只会得到一堆连接池和 SSL 层的怪问题。你的项目现状建议做法.NET Framework 4.0原生 ADO.NET放心用 6.8.3只需 MySql.Data.dll.NET Framework 4.5EF5用 6.8.3 MySql.Data.Entity.dll.NET Framework 4.5EF6用 6.8.3 MySql.Data.EntityFramework.dll注意 DbConfiguration.NET Core / .NET 5放弃 6.8.3换新版驱动服务器是 MySQL 8.06.8.3 能连但账号认证必须兼容旧协议决定守住 6.8.3 的团队通常不是贪便宜而是交付基线不允许动。换新版驱动看着只是换 dll实际上 SslMode 默认值变了、连接池行为变了、异常类型变了都是要重新过测试的。所以我的态度是没有明确收益就不升锁版本本身就是一种工程决策。3. 最小可运行方案引用 MySql.Data.dll 跑通第一条 SELECT这一章直接给能抄的作业把 dll 放进项目、写连接串、跑查询。读完这一章你不需要任何注册表操作就能在开发机跑通这也是 noinstall 包相比 MSI 最舒服的地方。3.1 复制 dll 到项目并添加引用HintPath 与 Copy Local 的配合常见做法是把 dll 放在项目根目录的 lib 文件夹里用 csproj 的 HintPath 引用而不是直接从解压目录拖到引用列表里。为什么HintPath 是相对路径换机器、换分支都能解析直接从解压目录引用路径一旦失效编译报错都看不清是缺文件还是路径变了。ItemGroup Reference IncludeMySql.Data HintPath..\..\vendor\mysql-connector-net-6.8.3\MySql.Data.dll/HintPath PrivateTrue/Private /Reference /ItemGroup这段配置里HintPath是 csproj 文件到 dll 的相对路径..\..\vendor是向上两级找到 vendor 目录。Private等价于 Visual Studio 属性面板里的复制本地设为 True 表示编译后把 MySql.Data.dll 复制到 bin 输出目录。这两个参数要配套HintPath 保证编译时找到程序集Private 保证运行时 bin 目录里有程序集。只配 HintPath 不配 Private开发机能跑部署到干净机器就报找不到 dll这是最常见的第一道坑。3.2 连接串参数拆解Server、Port、SslMode、CharSet 等 10 个高频项连接串是 MySQL 驱动里最像玄学的地方因为驱动对未知参数是静默忽略的。你把参数名拼错一个字母它不报错只是默默用默认值最后表现为连不上或者连上了但字符集不对。所以与其背参数不如先把高频参数的默认值和影响背下来。参数默认值说明Serverlocalhost主机地址生产环境尽量写内网 IPPort3306非默认端口必须显式写Database无相当于 USE dbUid / Pwd无账号密码SslModePreferred6.8 的默认值很多连接问题的源头CharSetutf8老库可能是 latin1要按实际库核对ConnectionTimeout15单位秒指建立连接的超时PoolingTrue连接池开关MaximumPoolSize100池上限高并发要评估AllowUserVariablesFalse允许 SQL 里用 用户变量SslMode 值得单独拎出来说。6.8.3 的默认值是 Preferred意味着服务器支持 SSL 就会尝试握手而老版本 MySQL 自签证书、或者协议协商有问题时这个握手会直接失败。开发环境连不上的时候第一个动作就是把 SslMode 显式写成 None排除掉 SSL 协商这个变量。CharSet 则是另一个重灾区数据库表是 latin1连接串写 utf8查询结果不乱但写入就变成乱码反过来更麻烦。原则是连接串字符集对齐数据库实际编码而不是对齐你以为的编码。3.3 一个能直接抄的查询示例参数化查询与显式类型下面这段是完整的控制台查询代码把 dll 引用好、连接串一换就能跑。注意 6.8.3 是 Framework 4.0 时代的 API代码里我用的是老式 using 块写法别拿 C# 8 的using var去套编译过不去。using System; using MySql.Data.MySqlClient; class Program { static void Main() { // SslModeNone 先排除 SSL 握手干扰CharSet 对齐库编码 string connStr Server127.0.0.1;Port3306;Databaseappdb;Uidappuser;Pwdyourpass;SslModeNone;CharSetutf8;ConnectionTimeout15;Poolingtrue;MaximumPoolSize50;AllowUserVariablestrue; using (var conn new MySqlConnection(connStr)) { conn.Open(); // 参数名用 前缀和 SQL 占位符一一对应 using (var cmd new MySqlCommand(SELECT id, name, created_at FROM users WHERE status status, conn)) { // 数字参数建议显式声明 DbType见下方说明 cmd.Parameters.Add(status, MySqlDbType.Int32).Value 1; using (var reader cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine({0}\t{1}, reader.GetInt32(0), reader.GetString(1)); } } } } } }代码逻辑不复杂Open 建立连接MySqlCommand 承载 SQL参数通过 Parameters 集合传入ExecuteReader 返回流式读取的数据集。值得讲的是参数化的两个细节。第一必须用命名参数status驱动会把参数值和 SQL 分开发送既防注入又避免字符串拼接的引号地狱。第二我在注释里特意不用AddWithValue而是用Add加MySqlDbType.Int32显式指定类型。这是 6.x 时代的血泪经验AddWithValue在部分版本里会把数字参数推断成字符串导致 WHERE 条件走不上索引表大了直接慢查询。数字参数显式声明类型字符串参数再看情况这个习惯值得固定下来。跑通这段代码后你的 noinstall 之旅就完成了一半。接下来要考虑的是这个驱动要不要给整台机器共享要不要接 EF这就进入第 4 章的全局注册路线。4. noinstall 的正式部署路线GAC、machine.config 与 EF 的 provider 注册项目内引用只解决我的进程能用。真实部署里还有两类诉求IIS 上多个站点共用一份驱动或者老工具通过 DbProviderFactories 按 invariant name 找工厂类。这时候就得手工做 MSI 安装包本来会做的事装 GAC、注册 machine.config、配 EF provider。这一章按三步走。4.1 为什么 noinstall 还要手动注册IIS 站点共享驱动的真实需求先纠正一个常见误解把 dll 放到 bin 目录CLR 就会优先加载它而忽略 GAC。实际 CLR 对强名称程序集的解析顺序是先查 GAC再查应用目录。如果机器上装过 MSI 版本的连接器GAC 里已经有一份同版本或者更高版本的 MySql.Data你 bin 目录里那份反而可能不被使用或者两个版本在同一进程里纠缠。这个机制决定了两种场景必须走注册路线。第一种场景是 IIS 多站点。每个站点的 bin 各放一份 6.8.3 dll 不是不行但维护成本高升级驱动要全站挨个替换。把驱动装进 GAC所有站点共享同一份配合 machine.config 里的 DbProviderFactories 注册站点的 web.config 只需要写连接串。第二种场景是依赖工厂模式的老工具它们不直接 new MySqlConnection而是通过DbProviderFactories.GetFactory(MySql.Data.MySqlClient)拿工厂这条路必须要 machine.config 或 app.config 里注册过才能走通。我的原则是单机单应用就用 bin 引用别折腾 GAC多站点、多应用、有老工具依赖工厂模式的才上全局注册。全局注册不是免费的它把版本冲突从单个应用级升级成了机器级一改全动必须谨慎。4.2 用 gacutil 安装并检查程序集命令与常见参数GAC 的安装工具是 gacutil它在 Windows SDK 的 Tools 目录里具体位置因 SDK 版本而异通常在NETFX 4.x Tools子目录下。没有 SDK 的机器可以用开始菜单搜 gacutil 碰碰运气。整个安装要点只有三个管理员权限、用 dll 绝对路径、安装后立刻验证。gacutil /i C:\app\vendor\mysql-connector-net-6.8.3\MySql.Data.dll # 验证/l 是列出可以用通配符 gacutil /l MySql.Data # 卸载指定版本避免误删同名的其他版本 gacutil /u MySql.Data,Version6.8.3.0命令本身很好懂/i是 install/l是 list/u是 uninstall。注意/u后面如果不带 Version 限定会把所有版本的 MySql.Data 全部卸载所以在多版本共存的机器上做任何卸载操作前先/l MySql.Data看清现状。gacutil /if是强制覆盖一般不建议用它会在程序集被占用时仍然覆盖容易让运行中的站点下一次加载就崩。还有一点GAC 只解决程序集在全局可用不解决DbProviderFactories 认识它。这两件事是分开的很多人把 dll 塞进 GAC 就以为万事大吉结果工厂模式还是报provider 未注册那是因为第 4.3 节的配置没做。4.3 注册 DbProviderFactoriesmachine.config 与 app.config 两条路径怎么选注册工厂类有两条路径改机器级 machine.config或者改应用级 app.config / web.config。选择标准一句话只影响当前应用就写 app.config整机所有应用都要用就写 machine.config。注意 machine.config 在 64 位系统上有两份32 位进程读Framework目录那份64 位进程读Framework64目录那份IIS 应用池的位数决定读哪份九个字先看池子位数再改文件。configuration system.data DbProviderFactories remove invariantMySql.Data.MySqlClient / add nameMySQL Data Provider invariantMySql.Data.MySqlClient description.Net Framework Data Provider for MySQL typeMySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version6.8.3.0, Cultureneutral, PublicKeyTokenc5687fc88969c44d / /DbProviderFactories /system.data /configuration这段配置里的关键是type字符串它由四段组成类型全名、程序集名、版本号、公钥令牌。MySql.Data.MySqlClient.MySqlClientFactory是工厂类全名MySql.Data是程序集名Version 和 PublicKeyToken 必须和 2.2 节 PowerShell 实测的一致。我这里写的 token 是常见值如果你的 dll 实测不一致全文替换即可。remove节点写在add前面是防冲突的惯用手法如果机器配置里已经注册过同名 invariantremove先清掉再add避免已存在的报错。4.4 注册后的验证用 DbProviderFactories 反向核对版本配置写没写对光看文本没用要运行时验证。PowerShell 一行命令就能确认工厂能不能按 invariant 名字拿到以及拿到的版本是不是 6.8.3.0。$f [System.Data.Common.DbProviderFactories]::GetFactory(MySql.Data.MySqlClient) $f.GetType().Assembly.FullName如果输出里包含Version6.8.3.0说明你机器上那个进程该读的配置文件生效了。如果输出是别的版本说明你改的文件不是这个进程实际读取的那份去核对 x86/x64 的 machine.config 路径。如果抛异常说 provider 未注册先查remove和add的 invariant 拼写是否完全一致invariant 是大小写不敏感的但字符不能差。这一步验证是 EF 场景的前置条件第 5 章第一个坑就跟它直接相关。5. noinstall 避坑手册五个高频故障从现象到解决用 noinstall 包最磨人的不是安装而是排障。这一章写五个我反复遇到的故障全部按现象 → 原因 → 解决的顺序展开。每一个背后都对应一类配置错误看完能省掉大半天的排查时间。5.1 现象运行时抛 Could not load file or assembly MySql.Data, Version6.8.3.0编译通过一运行就抛 FileLoadException 或 FileNotFoundException报错里指名要 6.8.3.0 版本。这个现象在部署到新机器时尤其常见。原因是强名称程序集的解析要求版本完全匹配CLR 会先按完整名称找 GAC找不到再去应用目录。如果 bin 目录里根本没有 MySql.Data.dll或者 Copy Local 没生效就会报找不到如果 GAC 里有不同版本也可能加载错版本然后抛版本不匹配。解决分三步。第一步查 bin 输出目录确认 MySql.Data.dll 是否真的在没有就先解决PrivateTrue和清理重建。第二步确认 GAC 里有没有其他版本的 MySql.Data有就先卸载脏版本。第三步如果项目里其他库编译时绑定了更高版本可以通过 binding redirect 临时收敛到 6.8.3.0但这是过渡手段治本还是统一全链路的版本。configuration runtime assemblyBinding xmlnsurn:schemas-microsoft-com:asm.v1 dependentAssembly assemblyIdentity nameMySql.Data publicKeyTokenc5687fc88969c44d cultureneutral / bindingRedirect oldVersion0.0.0.0-6.9.99.99 newVersion6.8.3.0 / /dependentAssembly /assemblyBinding /runtime /configuration这个配置的含义是把 0.0.0.0 到 6.9.99.99 范围内请求的 MySql.Data 全部重定向到 6.8.3.0。我不建议长期靠它过日子因为新版驱动可能用了旧版没有的 API重定向后照样崩。正确姿势是定位是哪个库引了高版本把它也换回 6.8.3 对应版本redirect 只用来兜底。5.2 现象EF6 迁移报 The provider MySql.Data.MySqlClient is not registeredEnable-Migrations 或 Update-Database 时EF 直接说 provider 没注册。这个现象最容易误导人因为你明明在 DbProviderFactories 里注册过了。原因是 EF6 和 EF5 的 provider 发现机制不一样EF6 不再从 DbProviderFactories 找 provider它看的是entityFramework配置节里的providers列表。两处配置缺一个EF 就不认识 MySQL。解决要点是核对三处一致性bin 目录里的 dll、entityFramework/providers里 type 字符串的程序集名和版本、连接串的 providerName。第 4 章的配置片段可以直接套用注意 EF6 对应的是 MySql.Data.EntityFramework.dll如果 bin 里只有 EF5 的 MySql.Data.Entity.dll这个配置就必炸。另一个同源坑是 DbConfiguration 冲突项目里同时引了 EF5 和 EF6 两个集成程序集EF6 启动时会发现多个 DbConfiguration 实例直接抛异常。解决方法是只保留一套然后显式声明用哪个[DbConfigurationType(typeof(MySqlEFConfiguration))] public class AppDbContext : DbContext { public AppDbContext() : base(namemysqlConn) { } }这段代码里的MySqlEFConfiguration是驱动自带的配置类型属性放在 DbContext 子类上EF6 启动时就会按这个类型加载 MySQL 的 provider 配置而不是去瞎猜。如果项目里有多个 DbContext记得所有上下文类都标上同一个属性或者用DbConfiguration.SetConfiguration在程序入口统一设置。5.3 现象连接 MySQL 8.0 报 Authentication method caching_sha2_password not supported驱动还是 6.8.3服务器换成了 MySQL 8.0连接直接失败报认证方法不支持。原因很清楚MySQL 8.0 把默认认证插件改成了 caching_sha2_password而 6.8.3 的年代只认识 mysql_native_password。这不是连接串问题是协议协商层面的不兼容。解决有两个方向。方向一如果你必须留 6.8.3那就把应用账号的认证插件改回旧协议。在 MySQL 8 上执行ALTER USER appuser% IDENTIFIED WITH mysql_native_password BY yourpass;改完用第 3 章的代码测试连接一般立刻恢复。注意这只影响指定账号不会动服务器全局配置风险可控。方向二如果服务器政策不允许旧认证插件那就只能换新版本驱动。两害相权我的建议是先查公司对认证插件的安全要求没有强制要求就改账号因为换驱动意味着第 2.3 节说的 SslMode 默认值、连接池行为全都要重新验证一遍。5.4 现象连接老 MySQL 卡死或报 Authentication to host failed 且没有详细错误连接串没写 SslMode连一台 SSL 配置不完整的服务器表现为两种要么请求超时要么在握手阶段失败报错信息含糊像网络问题。排查半天发现根本不是网络。原因是 6.8.3 的 SslMode 默认是 Preferred服务器支持 SSL 时驱动会尝试协商而老版本 MySQL 的自签证书、低版本 TLS 组合很容易在协商中失败。解决很简单连接串显式写SslModeNone先做排除如果确认是 SSL 协商问题再按需决定是保持明文还是配置真证书。生产环境如果要加密正确做法是SslModeVerifyCA并配上证书而不是继续用 Preferred 赌它协商成功。这里有一个明确的边界要讲清楚SslModeNone意味着流量明文在隔离内网可以接受在公网环境必须换 VerifyCA。别为了省事把 None 带到公网部署上那是给自己埋雷。5.5 现象同一台机器装了 MSI 又用 zipDbProviderFactories 拿到的是另一个版本机器上有过 MSI 版连接器后来你又部署了 noinstall 版的项目运行时发现工厂类返回的版本是 6.9.x 而不是 6.8.3。原因就是 MSI 在安装时写死了 machine.config 的 DbProviderFactories 节点版本号指向 MSI 装的版本你在 app.config 里 remove 再 add只是覆盖了当前应用IIS 里别的站点没做同样处理就仍然读机器配置。解决的核心是应用级覆盖要每个应用各自做。给受影响的每个站点的 web.config 都加上第 4.3 节的 remove add 片段。如果整机都想统一到 6.8.3那就直接改 machine.config但要先做好备份改完立刻用 4.4 节的验证命令分别测 32 位和 64 位两个文件。还有一个更省事的策略把 MSI 行为导致的脏 GAC 清理掉用 gacutil /u 和 app.config 覆盖组合拳之后这台机器的 MySQL 驱动生态就完全在你的掌控下了。6. 把 noinstall 变成团队基建指纹校验与版本固化noinstall 包最大的风险不是技术是来个新同事不知道用哪个版本、从哪拿的文件。最后一章给三个具体动作把这件事从个人经验变成团队资产。第一个动作给 zip 做哈希指纹。部署包在群里传来传去最怕有人从某个不可考的渠道重新下载了一份。拿到 zip 的第一件事就是算哈希和已知值比对不一致直接拒收不要打开看。Get-FileHash mysql-connector-net-6.8.3-noinstall.zip -Algorithm SHA256这个命令输出一个 64 位十六进制字符串把它固化进项目 README。以后任何人接手第一步就是跑这条命令确认文件没被掉包。文件版本号可以伪造哈希做不了假。第二个动作把版本固化进私有源。常见做法是把驱动打包成内部 nupkg 放进离线 NuGet 源团队所有项目统一从这个源引用。这样 6.8.3 的 dll、版本号、依赖关系全都有记录不再依赖个人 U 盘。内部源的稳定意义大于省事意义它让这个项目为什么锁 6.8.3这件事在包管理器的历史里可追溯。第三个动作维护一份三分钟验证清单。任何环境部署完照着清单跑一遍再交付比事后接到故障电话强十倍。检查项方法期望结果dll 版本2.2 节 PowerShellVersion6.8.3.0bin 输出查看 bin 目录存在 MySql.Data.dll连接测试3.3 节代码SELECT 正常返回工厂注册4.4 节 GetFactory返回 6.8.3.0EF 迁移Update-Database -Verbose无 provider 报错我的习惯是把这份清单写进部署文档的第一页每次交付都按顺序过一遍。6.8.3 这个版本的坑基本都踩过一遍之后你会发现 noinstall 包反而比 MSI 更可控——装了什么、注册了什么、每个文件在哪全都清清楚楚。希望帮到你。本文还有配套的精品资源点击获取
返回列表