關於這個框架的介紹我就不多說,有興趣的可以參見官方文檔: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,運行網站,可以看到我們網站正常運行了。