【亲测】Asp.net Mvc5 + EF6 code first 方式连接MySQL总结
本文原文地址为:https://www.cnblogs.com/summit7ca/p/5423637.html
原文测试环境为windows 8.1+Vs2013+MySql5.7.12
本人在win10+vs2017+MySql5.7下测试通过
最近由于服务器变更为Linux系统.MsSql for Linux什么时候出来到生产环境使用还是要很长时间的.于是考虑使用Mysql数据库,ORM使用EF.于是先踩下坑顺便记录一下,有需要的tx可以参考下.
当你考虑使用EF连接Mysql的时候肯定是已经在网上搜了一堆教程.网上教程基本都是使用控制台做演示.跟着一步步来姿势没错的话可能会正常运行,但项目中使用分层后,把数据层剥离出去,再使用code first连接瞬间蒙B了,各种奇葩问题随之而来.咋跟教程说的不一样呢...所以本文就一步步的介绍如何在分层的项目中使用EF code first连接Mysql.
ps:本文测试环境为windows 8.1+Vs2013+MySql5.7.12
一.搭建环境及安装对应组件
首先创建一个空的MVC项目后简单的再创建一个类库项目用于EF的操作以及实体的存放(这里为了演示没有创建过多的项目).最终结果如下:

然后在.Data项目中用Nuget安装EF.然后安装MySql数据驱动所需dll:
MySQL.Data.Entities.dll //Nuget默认会带上MySQL.Data.dll
本人是在Data项目中,先安装最新版的EntityFramework(版本号:6.2)
然后再安装:MySql.Data.Entity.EF6(安装后的名称为MySql.Data.Entity.EF6,此项会自动安装MySql.Data)
在启动项目中没有安装这两项,也是通过了测试的
添加一个继承自DBContext的类MyDbContext.cs:
namespace EF2MySqlApp.Data
{
public class MyDbContext:DbContext
{
public MyDbContext()
{ } public DbSet<BookInfo> BookInfoes { get; set; }
}
}
此处,本人修改为
public class MyDbContext : DbContext
{
public MyDbContext():base("name=MyDbContext")
{ }
protected override void OnModelCreating(DbModelBuilder mb)
{
base.OnModelCreating(mb);
}
public DbSet<BookInfo> BookInfoes { get; set; }
}
接着建个文件夹放实体类BookInfo.cs:
namespace EF2MySqlApp.Data
{
public class BookInfo
{
public int Id { get; set; } public string Number { get; set; } public string Name { get; set; } public string Author { get; set; } public decimal Price { get; set; } public bool Deleted { get; set; } public DateTime CreatedOn { get; set; }
}
}
结构类似这样:
二.配置EF
接着该是配置数据库连接字符串了,现在在App.Config下添加connectionString字节,注意别写到configSections上边去了,否则进行添加Migration会报节点配置错误.
本人是将此内容加到启动项目的web.config中的。
<connectionStrings>
<add name="MyDbContext" connectionString="Data Source=localhost;port=3306;Initial Catalog=myappdb;uid=root;password=123456;Charset=utf8" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
然后打开程序包管理器控制台(-_-不知道的请自定搜索),默认项目选择.Data项目,然后输入这个命令:
Enable-Migrations //启用迁移
本人测试中,此部会报”未将对象引用设置到对象的实例“的错误:

不用管它,接着下一步。
没有错误提示接着输入:
Add-Migration record1 //给本次迁移记录起个名字 这个名字可以随便起,尽量别重名 注意这里的Migration没有s结尾.
这时看到项目下已经多了几个文件:
Configuration.cs为进行迁移前的配置文件.以时间戳+刚才输入的名字的文件为迁移记录文件.本文重点不在此,所以各个作用在此不做过多介绍.有兴趣可自行搜索学习.
在Configuration类的构造函数中有这么一句话,它的作用在于是否启用自动迁移,默认不启用:
AutomaticMigrationsEnabled=false;
在Seed方法中可以添加种子数据,迁移成功后将会执行这个方法,把数据插入到数据库中.
protected override void Seed(EF2MySqlApp.Data.MyDbContext context)
{
context.BookInfoes.AddOrUpdate(x => x.Id,
new BookInfo { Name="C#大法好",Author="summit", Number="1234",Price=1024}
);
context.SaveChanges();
}
注意最后需要保存一下
这个时候如果直接update-database将会报Sql Server连接失败的错误:如下:
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。....
问题来了,想连接MySql怎么默认使用了Sql Server呢.这是EF默认连接的是SqlServer 所以要告诉EF我们需要使用Mysql:
在Configuration类的构造函数中加入:
SetSqlGenerator("MySql.Data.MySqlClient",new MySql.Data.Entity.MySqlMigrationSqlGenerator());
给MyDbcontext类增加DbConfigurationType特性:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyDbContext:DbContext
{
public MyDbContext()
{ } public DbSet<BookInfo> BookInfoes { get; set; }
}
ps:这个也可以在config文件里配置,个人比较喜欢用代码控制.
再次运行Update-Database -v 依然报错,但提示字符串格式不正确,往上翻翻看到DbContenniton获取字符串的时候出错了,于是猜测是否是连接字符串的问题:
System.ArgumentException: 从索引 0 处开始,初始化字符串的格式不符合规范。
在 System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue)
此处,因为本人将扎连接字符串写到启动项目的web.config的原因,测试时未报错。
连接字符串测试没发现问题,那会不会是找不到这个连接字符串呢? N久后发现在这个控制台中使用的config文件默认是到当前启动项目下寻找config文件.
把Data项目设为启动项后再次运行报:
The underlying provider does not support the type 'nvarchar(max)'.
这个错误由于MySql字段不兼容string类型,在string类型字段前加注解[MaxLength(100)]即可解决(奇怪的是我用vs2015测试是不会报这个错误的..).
此处,本人测试时未报错。可能是VS2017有所改进的原因。因此,并未在string类型字段前加注解[MaxLength(100)]。
再次执行Update-DataBase -v 成功!
如果使用的mysql命令行:输入这些命令查看是否创建成功:
show databases;
use myappdb;
select * from bookinfoes;
用其他客户端的那就更不必多说了.
另可能出现的错误问题:
Error A.出现这个错误请先检查连接字符串是否正确,mysql与mssql的连接字符串有所区别.确认无误后检查此连接是否有效,是否可正常打开.
System.Data.Entity.Core.ProviderIncompatibleException: 提供程序未返回 ProviderManifestToken 字符串。
---> MySql.Data.MySqlClient.MySqlException: Unable to connect to any of the specified MySQL hosts.
Error B.出现MySqlException此类问题多是未安装Connector/Net驱动 可到官网下载 https://dev.mysql.com/downloads/connector/net/
此步,在VS2017中不需要。
未解析成员“MySql.Data.MySqlClient.MySqlException,MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”的类型。
【亲测】Asp.net Mvc5 + EF6 code first 方式连接MySQL总结的更多相关文章
- Asp.net Mvc 使用EF6 code first 方式连接MySQL总结
最近由于服务器变更为Linux系统.MsSql for Linux什么时候出来到生产环境使用还是要很长时间的.于是考虑使用Mysql数据库,ORM使用EF.于是先踩下坑顺便记录一下,有需要的tx可以参 ...
- ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用
文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-ef-6-get-started-model.html 上一节:ASP.NET MVC ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 任务调度系统界面 http: ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入
系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级
系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统
开篇:从50开始系统已经由MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4. ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试
1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(66)-MVC WebApi 用户验证 (2)
前言: 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(65)-MVC WebApi 用户验证 (1) 回顾上一节,我们利用webapi简单的登录并 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)
开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理 http://ww ...
随机推荐
- SparkStreaming流处理
一.Spark Streaming的介绍 1. 流处理 流式处理(Stream Processing).流式处理就是指源源不断的数据流过系统时,系统能够不停地连续计算.所以流式处理没有什么 ...
- canvas 经典播放器图标
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- LeetCode--031--下一个排列(java)*
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
- selenium、UA池、ip池、scrapy-redis的综合应用案例
案例: 网易新闻的爬取: https://news.163.com/ 爬取的内容为一下4大板块中的新闻内容 爬取: 特点: 动态加载数据 ,用 selenium 爬虫 1. 创建项目 scrapy ...
- YouTuboba视频搬运~哔哩哔哩
将YouTube上面的视频搬运到哔哩哔哩上面教程 1.首先选择YouTube上面一个视频,需要谷歌登录,然后保存这个视频播放链接. 2.在浏览器中输入这个网址:en.savefrom.net,点击En ...
- Node.js 8 中的 util.promisify的详解
Node.js 8带来了 很多新特性 .其中比较值得注意的,便有 util.promisify() 这个方法. util.promisify() 虽然 Promise 已经普及,但是 Node.js ...
- OO的奇妙冒险1
OO的奇妙冒险 ~OOP入门与字符串处理~ 目录 总体分析 作业内容分析 作业内容总结 互测的收获 公测互测bug分析与总结 不太正经的个人自嗨 总体分析 公测 中测(基础与进阶): 其实在我看来,从 ...
- 在浏览器端获取文件的MD5值
前几天接到一个奇怪的需求,要在web页面中计算文件的md5值,还好这个项目是只需兼容现代浏览器的,不然要坑死了. 其实对文件进行md5,对于后端来说是及其简单的.比如使用Node.js,只要下面几行代 ...
- 【调试基础】Part 1 寄存器
01 寄存器体系 02 16/32/64位寄存器
- Oracle中查看SQL语句的索引命中情况及CPU占用
第一种: 在PL/SQL中,在Explain plan Window中执行要优化的Sql语句.结果,如下图: Object name列中显示了命中的索引名,Cost列显示了CPU的使用率(%). 第二 ...