菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
334
0

vs2013+EF6.2+MySQL8.0填坑指南

原创
05/13 14:22
阅读数 88547

在vs2013中使用EntityFrameworkDatabase First连接MySQL,因为软件版本不兼容,会出现找不到MySQL数据源驱动、闪退、无法选择实体框架6.0等问题,实在是一个巨坑,跟亲儿子SQLServer差别实在太大;
各版本兼容性请参考MySQL官网,MySQL for Visual StudioConnector/NET Versions

配置过程

经过反复测试,如下配置结果正常,请依次检查安装,当然这应该不是唯一选择;如果某个软件版本不同,列表中其它软件版本可能也要变动;

软件 地址 说明
.Net Framework v4.5.2 下载
vs2013
mysql-8.0.23-winx64 下载
MySQL for Visual Studio 1.2.8 下载
MySQL Connector Net 8.0.18 下载
EntityFramework6.2.0 下载

新建项目/控制台应用程序,在引用/右键/添加引用,选择/浏览,找到mysql connector net8.0.18安装目录...\Program Files (x86)\MySQL\MySQL Connector Net 8.0.18\Assemblies\v4.5.2,引入MySql.DataMySql.Data.EntityFramework两个dll文件;
修改App.configdefaultConnectionFactory节点可有可无,provider节点如果有版本号,一定要和实际dll一致,可以不要版本号;

<?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" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework"></provider>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/></providers>
  </entityFramework>
  <connectionStrings>
  </connectionStrings>
</configuration>

项目/右键/生成,这一步很重要,每次修改引用或配置都要做;
项目/右键/添加/新建项/ADO.NET 实体数据模型,正常就会出现如下窗口,选择您的数据库对象和设置;

完成,经过紧张的转换,弹出两个确认窗口,请选择确定,如果取消,就不会生成模型类和实体类,需要打开实体模型图点保存重新生成,或手动编辑相关文件;

至此,vs2013+EF6.2.0+MySQL8.0.23对接完成。

可能出现的问题

  1. 测试时,Database.ExecuteSqlCommand正常,Database.SqlQuery出错
  • 数据读取器包含多个字段。多个字段对于 EDM 基元或枚举类型无效。
  • 数据读取器与指定的“testModelMySQL.student”不兼容。类型“student_id”的成员在同名的数据读取器中没有对应的列。
  • Invalid attempt to Read when reader is closed.

解决办法:最初按网上方法安装了EntityFramework6.0.0,升级到6.2.0就好了;
管理 NuGet程序包默认安装最新版,旧版本只能通过程序包管理器控制台或本地程序包源安装;

  • UnInstall-Package EntityFramework -Version 6.0.0
  • Install-Package EntityFramework -Version 6.2.0
  1. 管理 NuGet程序包一直在检索信息,无法显示官网程序包源
    用NuGet联机安装包时,出现“基础连接已经关闭:发送时发生错误”。后来打开NuGet官网,发现NuGet不再支持tls1.0和1.1,修改注册表解决,原文链接;
    将以下内容存为.reg,双击导入即可,如果提示不是二进制文件,可以先从regedit导出一个,修改其中内容;

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

  1. 管理 NuGet程序包一直在检索信息,无法显示本地程序包源
    需要升级NuGet,vs2013/工具/扩展和更新,找到NuGet 包管理器,选中,点击卸载,关闭再打开vs2013,安装;

  2. 管理 NuGet程序包安装很慢
    官网下载.nupkg文件,在管理 NuGet程序包安装界面,点左下角设置,左侧程序包源,右侧点+,修改源为本地目录,改名称,点更新按钮;
    确定,左侧选中刚才的名称,即可显示本地包;

  3. 管理 NuGet程序包安装状态不符
    在vs20013项目根目录下找到packages.config,删除需要安装的包节点;

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.2.0" targetFramework="net452" />
</packages>
  1. 管理 NuGet程序包安装不上
    NuGet程序包安装完成两个工作,引入dll文件,修改项目配置;
    如果NuGet程序包始终安装不上,可以手动引入dll,修改配置文件即可达到同样效果,配置文件内容如上配置过程;引入dll分两类,是否.Net Framework v4.5.2自带,非自带可以从以前的项目找找;
.Net Framework v4.5.2自带 外部
System.ComponentModel.DataAnnotations EntityFramework6.2.0
System.Runtime.Serialization EntityFramework.SqlServer6.2.0
System.Security MySql.Data8.0.18
MySql.Data.EntityFramework8.0.18

测试代码

        static void Main(string[] args)
        {
            //MySQL EF6测试,2021-04-14
            testEntitiesMySQL db = new testEntitiesMySQL();

            //添加数据
            //db.student.Add(new student { name = "这是一个测试",age=22,class_id=3 });
            //db.SaveChanges();

            //db.student.Add(new student { name = "李四", age = 21, class_id = 1 });
            //db.student.Add(new student { name = "王五", age = 18, class_id = 4 });
            //db.student.Add(new student { name = "赵六", age = 18, class_id = 3 });
            //db.SaveChanges();

            //修改数据
            //student stu2 = (from t in db.student where t.student_id == 2 select t).FirstOrDefault();
            //stu2.name = "张三";

            //student stu6 = (from t in db.student where t.student_id == 6 select t).FirstOrDefault();
            //stu6.name = "吴青峰"; stu6.age = 25;
            //student stu7 = (from t in db.student where t.student_id == 7 select t).FirstOrDefault();
            //stu7.name = "史俊威"; stu7.age = 32;
            //student stu8 = (from t in db.student where t.student_id == 8 select t).FirstOrDefault();
            //stu8.name = "谢馨仪"; stu8.age = 17;
            //db.SaveChanges();

            //删除数据
            //student stu1 = (from t in db.student where t.student_id == 1 select t).FirstOrDefault();
            //if (stu1 != null)
            //{
            //    db.student.Remove(stu1);
            //}
            //db.SaveChanges();

            //批量添加数据
            //List<student> stulist = new List<student>{
            //    new student{name = "李四光", age = 52, class_id = 3},
            //    new student{name = "竺可桢", age = 68, class_id = 4},
            //    new student{name = "茅以升", age = 46, class_id = 2},
            //};
            //db.student.AddRange(stulist);
            //db.SaveChanges();

            var tran = db.Database.BeginTransaction();  //开启事务
            try
            {
                student stu1 = (from stu in db.students where stu.student_id == 3 select stu).FirstOrDefault();
                tran.Commit();
                if (stu1 != null)
                {
                    Console.WriteLine("Linq:{0},{1},{2},{3}", stu1.student_id, stu1.name, stu1.age, stu1.class_id);
                }
            }
            catch (Exception)
            {
                tran.Rollback();
                throw;
            }

            int sc = db.Database.ExecuteSqlCommand("select count(1) from students");
            Console.WriteLine("ExecuteSqlCommand人数:{0}", sc);

            int uc = db.Database.ExecuteSqlCommand("update students set name = name + '姓名' where student_id = 1;");
            Console.WriteLine("ExecuteSqlCommand受影响行数:{0}", uc);

            Console.WriteLine("Database.SqlQuery人数:{0}", db.Database.SqlQuery<int>("SELECT count(1) FROM students").First().ToString());
            
            IList<student> Databaselist = db.Database.SqlQuery<student>("SELECT * FROM students;").ToList();
            foreach (var item in Databaselist)
            {
                Console.WriteLine("Database.SqlQuery:{0},{1},{2},{3}", item.student_id, item.name, item.age, item.class_id);
            }

            int ROWCOUNT = db.Database.SqlQuery<int>("update students set name = 'sa' where student_id = 0; SELECT ROW_COUNT();").First();
            Console.WriteLine("Database.SqlQuery ROW_COUNT():{0}", ROWCOUNT);

            Console.WriteLine("students.SqlQuery人数:{0}", db.students.SqlQuery("SELECT * FROM students").Count());
            IQueryable<student> Studentslist = db.students.SqlQuery("SELECT * FROM students;").AsQueryable();
            foreach (var item in Studentslist)
            {
                Console.WriteLine("students.SqlQuery:{0},{1},{2},{3}", item.student_id, item.name, item.age, item.class_id);
            }


            Console.ReadLine();
        }

发表评论

0/200
334 点赞
0 评论
收藏
为你推荐 换一批