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