在vs2013中使用EntityFramework
Database First连接MySQL
,因为软件版本不兼容,会出现找不到MySQL数据源驱动、闪退、无法选择实体框架6.0等问题,实在是一个巨坑,跟亲儿子SQLServer
差别实在太大;
各版本兼容性请参考MySQL
官网,MySQL for Visual Studio,Connector/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.Data
和MySql.Data.EntityFramework
两个dll文件;
修改App.config
,defaultConnectionFactory
节点可有可无,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对接完成。
可能出现的问题
- 测试时,
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
管理 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
-
管理 NuGet程序包
一直在检索信息,无法显示本地程序包源
需要升级NuGet,vs2013/工具/扩展和更新,找到NuGet 包管理器
,选中,点击卸载,关闭再打开vs2013,安装; -
管理 NuGet程序包
安装很慢
从官网下载.nupkg文件,在管理 NuGet程序包
安装界面,点左下角设置,左侧程序包源,右侧点+,修改源为本地目录,改名称,点更新按钮;
确定,左侧选中刚才的名称,即可显示本地包; -
管理 NuGet程序包
安装状态不符
在vs20013项目根目录下找到packages.config,删除需要安装的包节点;
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="6.2.0" targetFramework="net452" />
</packages>
管理 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();
}
© 著作权归作者所有
发表评论