做.Net开发的童鞋想必都知道平时做开发用的比较多的数据库是SqlServer,EF作为非常流行的ORM框架,用它来操作数据库给我们带来了极大的方便,但是我们如何通过EF来连接MySql数据库呢,毕竟MySql是免费的嘛,今天我主要讲解下如何通过EF连接MySql数据库以及踩过的一个小坑,我们从具体的例子入手,方便大家快速掌握。
1、首先,打开vs2017,然后新建一个MVC项目(当然你可以创建你喜欢的项目类型,在这里我以MVC项目为例来讲解)
2、项目创建完成后,右击 引用->管理NuGet程序包,打开NuGet包管理器,然后输入mysql,添加如下程序集引用到项目中
3、添加完引用后vs会帮我们在web.config里自动生成EF的配置信息如下,注意需要手动给entityFramework节点添加属性codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6"
<configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6"> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider> </providers> </entityFramework>
4、下面我们新建一个实体 Post,这个实体到时候会映射到数据库中的表
public class Post { public int Id { get; set; } public string Name { get; set; } }
5、新建数据库上下文类,该类继承自EF的DbContext类
public class EFMySqlDbContext:DbContext { public virtual DbSet<Post> Posts { get; set; } }
6、接下来我们需要在web.config里配置数据库链接字符串,name属性的值必须和我们新建的数据库上下文类的名称(EFMySqlDbContext)相同,当然你也可以指定别的名称,只需要在EFMySqlDbContext类添加一个无参构造函数,并且调用父类的构造函数并传入链接字符串的name(例如:name=MyDbcontext),然后修改配置文件中的链接字符串属性name的值为你自定义的名称即可,最后要注意providerName属性的值。
<connectionStrings> <add name="EFMySqlDbContext" connectionString="data source=localhost;initial catalog=EFMySqlDemo; User ID=root;Password=123456;integrated security=True" providerName="MySql.Data.MySqlClient" /> </connectionStrings>
7、最后我们新建一个控制器,主要是用来访问数据库上下文类来让EF自动帮我们生成数据库
public class DemoController : Controller { public ActionResult Index() { using (var dbContext=new EFMySqlDbContext()) { var posts = dbContext.Posts.ToList(); } return View(); } }
哈哈!貌似快要大功告成,启动调试,打开网址 http://localhost:9723/Demo后,我发现程序在运行时报了如下错误:
"MySql.Data.MySqIClient.MySqlProviderSevices”违反了继承安全 性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安 全可访问性低。 "
经过苦苦的挖掘,最后发现是MySql.Data.Entity的版本问题,我安装的版本是6.10.5。
解决办法如下:
打卡NuGet管理控制器,选择版本为6.9.10,点击安装,生成一下项目,然后打开刚才的调试地址,此时打开MySql管理工具,发现EF已经成功的为我们生成了efmysqldemo数据库。
当然,如果你的版本没有问题的话,在最后一步就会成功生成数据库!
最后我再补充一个重点(请拿出笔和本记录一下,这个是考试重点!哈哈!),在启用EF自动迁移后,最后一步执行“update-database”可能会报“给定关键字不在字典中。”或者其他一些错误,解决办法如下:
在数据库链接字符串的配置里,给connectionString这个属性的值后面添加“persistsecurityinfo=True;allowzerodatetime=True;convertzerodatetime=True”,这样就可以成功迁移了。
如果你用的是EF的DbFirst开发模式,那么你还需要执行以下操作:
1、运行services.msc,重启MySQL服务。
2、在MySQL运行以下命令: use mydbname(你的数据库名称); set global optimizer_switch='derived_merge=OFF'。
3、重新生成 *.edmx。