【亲测】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

本人是先安装最新版的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”的类型。

原文地址:https://www.cnblogs.com/sky-net/p/9051449.html

时间: 2024-08-04 12:36:24

【亲测】Asp.net Mvc5 + EF6 code first 方式连接MySQL总结的相关文章

Asp.net Mvc 使用EF6 code first 方式连接MySQL总结

最近由于服务器变更为Linux系统.MsSql for Linux什么时候出来到生产环境使用还是要很长时间的.于是考虑使用Mysql数据库,ORM使用EF.于是先踩下坑顺便记录一下,有需要的tx可以参考下.当你考虑使用EF连接Mysql的时候肯定是已经在网上搜了一堆教程.网上教程基本都是使用控制台做演示.跟着一步步来姿势没错的话可能会正常运行,但项目中使用分层后,把数据层剥离出去,再使用code first连接瞬间蒙B了,各种奇葩问题随之而来.咋跟教程说的不一样呢...所以本文就一步步的介绍如何

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 MVC5 + EF6 入门教程 (5) Model和Entity Framework 源码下载:点我下载 一.Razor简介 在解决方案资源管理器中查看Views文件夹下的文件,如下图所示. 文件的后缀名都是.cshtml.这是什么文件呢?顾名思义,cshtml = cs + html,就是一个包含C S

构建ASP.NET MVC5+EF6+EasyUI 1.5+Unity4.x注入的后台管理系统(1)-前言与目录(持续更新中...)

前言: 起初写这个框架的时候,可以说在当时来说并不是很流行的设计模式,那是在2012年,面向对象的编程大家都很熟悉, 但是“注入.控制反转(DI,IOC,依赖注入).AOP切面编程”新兴名词 很多人并不知道特别是从事.NET开发的人,至少在当时 是这么样的,但是在今天它们却是非常流行的技术指标,很多大牛也承认,这是主流的开发模式,你们可以从招聘网的技术岗位看出. 我从事过MVC2.0到5.0的相关开发工作,见证了MVC的成熟演变过程,就像本框架一样,设计模式未曾改变,但是代码一直在重 构.我也坚

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(51)-系统升级

系统很久没有更新内容了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4.3. 并以easyui 1.4.3的gray皮肤为基础,升级10个扁平化皮肤 皮肤查看地址 更新的主要目的:新的MVC5特性和更好的性能 记录一下升级过程. 1.除了web层,其他全部提取. 2.新建解决方案.以前命名空间为App.现在更名为Apps. 3.

ASP.NET MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统

文章来源: Slark.NET-博客园http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-grid.html 上一节:ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用 源码下载:点我下载 要做一个完整的系统,除了需要MVC这样的B/S框架及EF这样的数据库访问技术之外,一个简洁.美观.大方的UI框架也是必不可少的. 话不多说,有请今天的主角登场!! 看看它的自我介绍,是不是很屌.没错,这个介绍一点都不夸

构建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简单的登录并进行了同域访问与跨域访问来获得Token,您可以跳转到上一节下载代码来一起动手. 继续上一篇的文章,我们接下来演示利用拿到的Token来访问接口,管理接口,利用系统权限管理接口,对每个接口进行授权(管理接口为选读部分,因为你需要阅读最开始权限管理部分(18-27节),才能阅读这部分) 开发环境: V

Asp.Net MVC4+EF6 Code First 权限管理系统 源码下载

这个权限管理系统是基于在@TZHSWEET 的权限管理系统之上做的修改.@TZHSWEET 那个是DB first. 这个是Code First.源码下载:http://download.csdn.net/detail/wode551120/7280559 http://pan.baidu.com/s/1o6uM2Ae 具体设计思路请参考@TZHSWEET  文章. 项目运行: 1.修改web.config 数据库连接 2.修改Global.asax Application_start方法中.取

ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 日程管理   http://www.cnblogs.com/ymnets/p/7094914.html 任务调度系统界面 http://www.cnblogs.com/ymnets/p/5065154.html 系统权限全套完整图  http://www.cnblogs.com/ymnets/p/5065201.html 系统

构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(1)-前言与目录(持续更新中...)

开篇:从50开始系统已经由MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4.3. 从50节起为MVC5+EF6+Unity4.x+Quartz 2.3 +easyui 1.4.3.的特性文章 所以你们也要更新你们的环境 功能不变属于无缝接入,最大改变只在UI,初学同学,直接使用MVC5 开发工具:VS2013+SQL2012 相关代码:演示地址暂时关闭   第2讲源码下载