首页 > 代码库 > 使用ABP EntityFramework连接MySQL数据库

使用ABP EntityFramework连接MySQL数据库

ASP.NET Boilerplate(简称ABP)是在.Net平台下一个很流行的DDD框架,该框架已经为我们提供了大量的函数,非常方便与搭建企业应用。

关于这个框架的介绍我就不多说,有兴趣的可以参见官方文档:http://www.aspnetboilerplate.com/Pages/Documents

使用ABP+EF+SQL Server是比较推荐的组合,但是既然我们使用的是EF,那么就应该是和数据库分离的,也就意味着我们应该可以采用其他的数据库,比如MySQL。

ABP初始化的项目模板还提供了Module Zero项目,为我们提供了用户、角色、权限等等通用功能,但是在使用初始化的模板连接MySQL却会报错,无法运行,下面我来解决ABP+MySQL的问题。这是操作步骤:

1.从官方网站下载ABP项目模板,并解压到本地,用VS打开,这里我们新建一个项目ConnectMySql。

2.设置XXX.Web为启动项目,Build这个Solution,使得NuGet下载相关的包。

3.准备好一个SQL Server数据库,修改Web.config数据库的ConnectionString,连接到SQL Server数据库。

4.打开Package Manager Console窗口,选择XXX.EntityFramework为默认项目,运行Update-Database命令,系统会在SQL Server中创建数据库和对应的表。

技术分享

5.打开SSMS,连接到上一步新建的数据库,选择生成脚本命令,并在高级选项中选择“Schema and data”生成一个创建表和填充数据的脚本文件。

6.接下来就是比较繁琐的SQL Server脚本转MySQL脚本了,我采用NotePad++,做了多次的批量替换,把脚本转换成MySQL支持的内容。

为了方便大家,我直接把转换好的SQL脚本放出,大家直接运行即可。 脚本下载

7.打开MySQL Server,新建一个MySQL数据库,并运行前一步骤准备好的脚本。

8.我们回到VS,为XXX.EntityFramework和XXX.Web,通过Nuget添加MySql.Data.Entity:

技术分享

9.打开Web项目的Web.config,由于上一步添加了MySql.Data.Entity,所以Web.config已经添加了MySql的相关配置。我们只需要修改连接字符串,注释掉SQL Server的字符串,添加新的连接字符串:

<add name="Default" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=test;uid=root;password=xxx" />

10.打开EntityFramework项目的Configuration对象,在Migrations文件夹中,修改构造函数,指定使用MySQL的SQL生成器。

public Configuration()
       {
           AutomaticMigrationsEnabled = false;
           ContextKey = "ConnectMySql";
          SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
       }

11.现在我们来试一试是否可以针对MySQL使用EF的Code First。我们在XXX.Core中创建一个测试用的实体Student:

public class Student:Entity
  {
      [StringLength(50)]
      public string Name { get; set; }
      public DateTime Birthdate { get; set; }

      public bool Gender { get; set; }
  }

12.在XXX.EntityFramework中找到ConnectMySqlDbContext,并添加Student的应用:

public class ConnectMySqlDbContext : AbpZeroDbContext<Tenant, Role, User>
{
     //TODO: Define an IDbSet for your Entities...
     public IDbSet<Student> Students { get; set; }
     /* NOTE:
      *   Setting "Default" to base class helps us when working migration commands on Package Manager Console.
      *   But it may cause problems when working Migrate.exe of EF. If you will apply migrations on command line, do not
      *   pass connection string name to base classes. ABP works either way.
      */
     public ConnectMySqlDbContext()
         : base("Default")
     {

     }

……

13.我们编译一下这个Solution,然后在Package Manager Console窗口中,输入命令Add-Migration AddStudent,这里的AddStudent是对我们这次更改的一个命令。命令运行完成后,在Migrations文件夹中,会创建升级数据库的C#代码。

技术分享

14.继续在Package Manager Console窗口中,输入命令Update-Database,系统会将数据库更改应用到我们的MySQL数据库中。

技术分享

15.我们到MySQL数据库中,刷新,可以看到系统自动创建了Students数据库:

技术分享

16.最后,我们Build整个Solution,运行网站,可以看到我们网站正常运行了。

使用ABP EntityFramework连接MySQL数据库