使用EntityFramework6链接MySQL
不是微软的亲儿子这待遇就是不同,其中的坑可真实很多,第一次连MySQL足足折腾了我大半天。html
废话很少说直接开始。mysql
安装MySQL
从官网上下载最新版,下载好之后直接安装就能够了。最新版的MySQL已经包含了全部开发须要的功能(包括MySQL链接器),相信会用MySQL,怎么装应该都没有问题,这里就不啰嗦了。不过有一点值得提醒的是,在选择要安装的内容时记得将全部功能都装上,以后出现问题多半都是哪一个模块漏装了。sql

安装好以后,在开始菜单中找到MySQL Workbench,这是MySQL自带的一款管理工具,我的也比较喜欢,一直用的也都是这个。之前要单独安装,不过如今自带了。数据库
建立数据库
为了演示我先建立一个叫test的数据库,并建立一张学生表Student数据结构

使用Entity Framework6 链接MySQL数据库
准备工做都就绪了,接下来我建立一个项目来演示如何链接MySQL数据库。数据库设计
考虑到有些同窗可能并不使用.NET MVC,因此这里咱们建立一个控制台项目来演示。别担忧,在.NET MVC中,配置的过程都是彻底同样的。工具
1、添加EF包

打开NuGet包管理工具后,点击浏览,而后搜索EntityFramework。先按装EntityFramework,再安装MySQL.Data.Entity.post

经过NuGet来安装EF能够帮咱们省去不少麻烦的配置环节。测试
2、经过向导来链接MySQL数据库
按照习惯,我先在项目中创建了一个Modules文件夹,用于保存全部生成的数据模型文件。以后右击,新建项。spa

以后选择ADO.NET实体数据模型,我取名为DBModel。

选择来自数据库的CodeFirst模型,点击下一步。

PS:EF有三种方式来运行。
第一种是经过EF设计器,相似于传统的数据库设计器,经过画出的数据结构图来生成对应的类(数据模型)和数据库,不过这种方式好像在EF7中将被废弃掉了,因此不推荐使用。
第二种是经过先建立好数据库,而后根据数据库来生成对应的数据模型,这种方式称之为数据库优先DB Frist。
第三种是先手工编写好须要的数据模型,而后根据数据模型逆向生成数据库,这种方式称之为代码优先 Code First。
注意:无论你是习惯数据库优先仍是代码优先。都请先用数据库优先来生成代码,这样会省去不少中间配置的环节。
以后选择新建链接

输入你的数据库地址(默认是localhost)和帐号、密码,勾选保存密码,在数据库名称中选择你对应的数据库,在这个人是test。完成后点击测试链接,提示没有问题后点击肯定。这一步若是出错通常都是数据库配置的问题,跟EF没有关系。

选择,是包含敏感信息

选择你须要的数据库和表,在这我选择的是我以前在数据库中建立的Student表。肯定所生产对象名称的单复数形式这个选项随意。最开始我也没理解到它的做用,其实就是英语的单复数,就是在名词后面加S和不加S。

点击完成以后若是你幸运的话,到这一步就成功了。不过事情通常没那么简单,傲娇的EF就提示我什么主键值为空。

我第一次弄的时候这东西折磨了我大半天,什么办法都试尽了,好在最后在Stack Overflow上找到了办法。
打开MySQL管理器,执行
- use `test`; /*你的数据库名*/
- set global optimizer_switch='derived_merge=OFF';
执行完以后再按照上面的步骤从头一遍应该就能够了,若是仍是不行就重启一下MySQL服务,再执行一下上面的代码,再试试。
3、分析生成的代码
回到解决方案资源管理器,这时咱们的项目下就应当多了两个文件,一个是DBModel数据库上下文(到时都是经过它来操做数据库),一个是student数据模型。
打开DBModel.cs

student数据模型中对数据作了些描述(你不用代码优先CodeFirst这些通常都不用管)

使用EF进行增删改查
到这一步EF链接MySQL就已经完成了,以后你就能够像操做SQL Server同样使用EF操做MySQL了。不过我仍是演示下如何使用EF操做数据库。
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- var student = (from t in db.students //查询张三
- where t.name == "张三"
- select t).First();
- Console.WriteLine("张三的年龄是:" + student.age); //输出:张三的年龄是:15
- db.students.Remove(student); //删除张三
- //db.Entry(student).State = System.Data.Entity.EntityState.Deleted; //或者这样删除张三
- db.students.Add(new student { name = "小明", age = 21 }); //向数据库中添加小明
- student = (from t in db.students //查询李四
- where t.name == "李四"
- select t).First();
- student.age = 999; //更改李四的年龄
- //db.Database.ExecuteSqlCommand("delete from test.student where true"); //执行普通的SQL,删除所有数据
- //var result = db.Database.SqlQuery<student>("select * from test.student"); //执行普通的SQL,查询全部学生
- db.SaveChanges(); //保存结果
- }
- Console.Read();
- }
- }