Asp.net Mvc 使用EF6 code first 方式连接MySQL总结
最近由于服务器变更为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
添加一个继承自DBContext的类MyDbContext.cs:
namespace EF2MySqlApp.Data
{
public class MyDbContext:DbContext
{
public MyDbContext()
{ } 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会报节点配置错误.
<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:
1.
在Configuration类的构造函数中加入:
SetSqlGenerator("MySql.Data.MySqlClient",new MySql.Data.Entity.MySqlMigrationSqlGenerator());
2.
给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)
连接字符串测试没发现问题,那会不会是找不到这个连接字符串呢? N久后发现在这个控制台中使用的config文件默认是到当前启动项目下寻找config文件.
把Data项目设为启动项后再次运行报:
The underlying provider does not support the type 'nvarchar(max)'.
这个错误由于MySql字段不兼容string类型,在string类型字段前加注解[MaxLength(100)]即可解决(奇怪的是我用vs2015测试是不会报这个错误的..).
再次执行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/
未解析成员“MySql.Data.MySqlClient.MySqlException,MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”的类型。
三.遗留问题
1.不设置Data项目为启动项找不到该项目下App.Config里配置的字符串(控制台默认项目已为该项目)
如果把连接字符串放到Web.Config里则需要在该项目里也安装ef,mysql.data... 但个人原因并不想在表现层出现ef等东西,不放又不去找App.config的配置.
这点着实疑惑了好久.每次这样设置启动项也挺麻烦的,所以可以手动指定连接字符串(亦可以写在其他地方读取过来放进去):
public MyDbContext()
: base("Data Source=127.0.0.1;port=3306;Initial Catalog=myappdb;uid=root;password=123456;Charset=utf8")
{ }
ps:如果迁移过程中出现未将对象引用到实例之类的错误多半原因就是连接字符串找不到或无效导致的,遇到这种问题先从连接字符串排查.
2.插入数据中含有中文乱码.
这个问题网上众说纷纭,改这个配置改那个配置的.跟着改后会发现然并卵...我这里插入中文后使用Mysql控制台查看数据乱码了,使用Navicat查看却是正常的.所以这个问题还在观测中,如果各位有什么好的解决办法可以留言 :)
([注意]2016/6/8更:我的编码问题已解决.可参考我这篇博文 Mysql 5.7.12解压版的安装及配置系统编码)
3.前几天有园友问了个问题,他使用MiniProfiler监控ef to mysql 监控不到sql语句.给他回复后也不知道他解决了没..
再次提示下:如果使用MiniProfiler过程中报了这个错误:
在尝试添加“Loaded”事件处理程序前,实体框架已在使用一个 DbConfiguration 实例。
检查下你的项目是否使用了EF的初始化数据配置.使用了的话需要把MiniProfilerEF6.Initialize();这句放到初始化配置之前.(我一般直接放到最前边 :) )
踩坑才刚刚开始,使用过程中肯定还会有各种问题.还会继续记录下来,给有需要的朋友提个醒.
如果看官中有老司机还望不吝赐教. -_-!
Asp.net Mvc 使用EF6 code first 方式连接MySQL总结的更多相关文章
- 【亲测】Asp.net Mvc5 + EF6 code first 方式连接MySQL总结
本文原文地址为:https://www.cnblogs.com/summit7ca/p/5423637.html 原文测试环境为windows 8.1+Vs2013+MySql5.7.12 本人在wi ...
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理
这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...
- ASP.NET MVC 5 学习教程:创建连接字符串
原文 ASP.NET MVC 5 学习教程:创建连接字符串 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...
- VS2013使用EF6通过ADO.NET 连接mySql成功步骤
VS2013使用EF6通过ADO.NET 连接mySql成功步骤 1.安装mysql-for-visualstudio-1.2.6(我用的目前最新版,这个一般安装VS2013就已经有了,没有的话下载一 ...
- jmeter中通过jdbc方式连接mysql数据库的配置参考
jmeter中通过jdbc方式连接mysql数据库的配置参考: Database URL=jdbc:mysql://ip:port/dbname?useUnicode=true&allowMu ...
- Spark JDBC方式连接MySQL数据库
Spark JDBC方式连接MySQL数据库 一.JDBC connection properties(属性名称和含义) 二.spark jdbc read MySQL 三.jdbc(url: Str ...
- ASP.NET MVC Controller向View传值方式总结
Controller向View传值方式总结 总结发现ASP.NET MVC中Controller向View传值的方式共有6种,分别是: ViewBag ViewData TempData 向普通Vie ...
- Asp.net Mvc Entity Framework Code First 数据库迁移
1.创建Mvc项目 2.安装Entity Framework 2.1.如下图打开程序包管理器控制台: 2.2.输入命令Install-Package EntityFramework,即可安装Entit ...
- 使用tomcat的jndi方式连接mysql的字符编码设置
最近新项目使用tomcat中配置jndi连接mysql的方式,在使用过程中发现查询条件为中文的时候查询不出结果,经过一通折腾,发现是jndi在连接数据库的时候忘记设置字符编码. 修改之后的完整配置如下 ...
随机推荐
- ActiveMQ初体验
首先介绍下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送. 下面介绍主题,就是今天为大家介绍的ActiveMQ ...
- Maven系列三Maven内置变量
Maven内置变量说明: ${basedir} 项目根目录(即pom.xml文件所在目录) ${project.build.directory} 构建目录,缺省为target目录 ${project. ...
- Stunnel使用2
1.首先测试一下stunnel.exe,是否能正常运行,正常的话,不会报错,在桌面右下角位置显示. 2.第一步完成后,打开stunnel.conf,对stunnel进行配置,需要修改一下几项:(mys ...
- MVC PageList使用(异步 与 正常)
此项目的功能为1.将数据分页显示,2.搜索数据按分页显示 3.异步或同步传递 一.第一步引用 mvc PageList插件 二.控制器写法 ) //为空则默认第一页 { var lm = DataBL ...
- c#中序列化
序列化(Serialization)是.NET平台的特性之一.1.为什么要序列化:首先你应该明白系列化的目的就不难理解他了.系列化的目的就是能在网络上传输对象,否则就无法实现面向对象的分布式计算.比如 ...
- Java集合系列:-----------01集合的整体框架
内容来自:http://www.cnblogs.com/skywang12345/p/3308498.html Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映 ...
- Linux Linux程序练习十四(多进程压力测试)
/* * 题目: * 编程一个基本多进程测试框架,提示用户输入进程数.和每个进程数运行圈数.(fork) * 进行多进程压力测试.(execve) * 要求父进程能监控所有子进程的退出,避免僵尸进程. ...
- Windjs应用
一个异步的js类库,应用价值不大,所以代码也没在维护了.在做h5特效或者游戏动画方面有点用处. $await是Windjs的核心api.具体可以check 浅谈Jscex的$await语义及异步任务模 ...
- 用RxJava处理嵌套请求
用RxJava处理嵌套请求 互联网应用开发中由于请求网络数据频繁,往往后面一个请求的参数是前面一个请求的结果,于是经常需要在前面一个请求的响应中去发送第二个请求,从而造成"请求嵌套" ...
- HTTPS科普扫盲帖
为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...