概述
上一篇簡單介紹了Dapper的基本用法,數據的存儲為SqlServer。那么這一篇就記錄一下使用EFCore來操作MySql的一些方式,這種模式比較適合那種一個項目中需要操作多種數據庫的模式。不過因為微軟官方並沒有提供其驅動,所以我們需要借助MySql官方提供的驅動進行基本的增刪改查操作。這樣一來我們也可以將數據庫遷移到Linux服務器上了,是不是很激動。當然了,Sql Server Love Linux!大家同樣是有目共睹,SQL Server 2017 Preview版本也已經支持在Linux上部署,但是當我看到需要至少3.25G的內存的時候,我是有點小情緒的,有要了解的話大家可以移步這里,很期待微軟下一步會有什么樣的大動作!好了,正文開始。

一、在Windows上安裝並配置MySql
1、先到官網上下載最新的發行版本5.7.18(社區版),選擇mysql-installer-community-5.7.18.1.msi,因為它已經包含了Server和Workbench。

2、雙擊下載好的文件開始安裝,這個版本的安裝體驗自我感覺已經比5.5的好了很多。如果嫌麻煩的話,你可以直接選擇第一個選項“Developer Default”——默認的開發環境來進行安裝,非常省事。不過我是一個.Netor,有些內容並不是必須的,所以我選擇“Customer”自定義來進行安裝了,接着下一步、

3、下面我列出來自定義選擇的一些安裝內容簡介
| MySQL Server | MySQL 服務器(必不可少,你懂的~) |
| MySQL Workbench | MySQL的數據庫建模工具(類似於SQL Server Management Studio) |
| MySQL Notifier | MySQL的DBA輔助工具(安裝好之后右下角會有一個小托盤) |
| Connector/ODBC | 數據庫與應用程序的互連標准 |
| Connnector/NET | .NET程序的數據庫驅動 |
其他一些高級功能比如MySQL Router,VS的可視化連接工具,Shell,文檔介紹等等就暫時忽略,以后需要的話可以隨時安裝

4、接下來選擇一個安裝路徑,然后點擊Execute進行安裝即可

5、服務器配置類型選擇開發環境“Development Machine”,端口默認3306,然后下一步

6、然后給Root賬戶設置一個密碼。其他賬戶你可以選擇暫時不添加,繼續下一步

7、將MySQL配置成一個Windows服務,並設置為開機啟動

8、應用你的所有配置,並完成安裝。整個過程耗時還是挺少的

9、啟動MySQL,輸入你剛才設置的root賬戶的密碼進行登陸。出現以下頁面,說明已經大功告成。

二、添加MySql.Data.EntityFrameworkCore到倉儲模塊
1、打開工具=》Nuget包管理器=》程序包管理控制台,輸入以下命令進行包的安裝,同時依賴也會跟着一起引入到項目中去
Install-Package MySql.Data.EntityFrameworkCore -Pre
幾個注意點這里說明一下:
a)、通過Nuget包管理器界面進行安裝的時候記得勾選“包括預發行版”,然后再進行搜索
b)、命令行記得帶上“-Pre”,表示預發行版本
c)、安裝的默認項目時選擇倉儲模塊Light.Repository

2、構建MySQL數據庫上下文,注意紅色字體的描述
/// <summary> /// MySQL數據庫訪問上下文 /// </summary> public class LightContext : DbContext { public LightContext(DbContextOptions<LightContext> options) : base(options) { } public DbSet<User> User { get; set; } }
/// <summary> /// MySQL的數據庫配置 /// </summary> public class MySQLDataBaseConfig { /// <summary> /// 默認的MySQL的鏈接字符串 /// </summary> private const string DefaultMySqlConnectionString = "server=localhost;userid=root;pwd=sasa;port=3306;database=light;"; public static LightContext CreateContext(string mySqlConnectionString = null) { if (string.IsNullOrWhiteSpace(mySqlConnectionString)) { mySqlConnectionString = DefaultMySqlConnectionString; } var optionBuilder = new DbContextOptionsBuilder<LightContext>(); optionBuilder.UseMySQL(mySqlConnectionString); var context = new LightContext(optionBuilder.Options); context.Database.EnsureCreated();//針對當前訪問的上下文對象,如果數據庫中存在該表,則不做修改;否則的話進行創建 return context; } }
3、接下來就是用我們准備好的數據庫上下文對用戶進行簡單的CRUD操作。因為得益於面向接口編程和DI的思想,只需要用EF的方式實現IUserRepository中定義的方法,然后將此注入倉儲即可
/// <summary> /// MySql中的用戶倉儲實現 /// </summary> public class UserRepositoryMySql : IUserRepository { /// <summary> /// 創建一個用戶 /// </summary> /// <param name="entity">用戶</param> /// <param name="connectionString">鏈接字符串</param> /// <returns></returns> public bool CreateEntity(User entity, string connectionString = null) { using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString)) { context.User.Add(entity); return context.SaveChanges() > 0; } } /// <summary> /// 根據主鍵Id刪除一個用戶 /// </summary> /// <param name="id">主鍵Id</param> /// <param name="connectionString">鏈接字符串</param> /// <returns></returns> public bool DeleteEntityById(int id, string connectionString = null) { using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString)) { context.User.Remove(context.Find<User>(id)); return context.SaveChanges() > 0; } } /// <summary> /// 獲取所有用戶 /// </summary> /// <param name="connectionString">鏈接字符串</param> /// <returns></returns> public IEnumerable<User> RetriveAllEntity(string connectionString = null) { using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString)) { List<User> allUsers = new List<User>(); allUsers.AddRange(context.User); return allUsers; } } /// <summary> /// 根據主鍵Id獲取一個用戶 /// </summary> /// <param name="id">主鍵Id</param> /// <param name="connectionString">鏈接字符串</param> /// <returns></returns> public User RetriveOneEntityById(int id, string connectionString = null) { using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString)) { return context.Find<User>(id); } } /// <summary> /// 修改一個用戶 /// </summary> /// <param name="entity">要修改的用戶</param> /// <param name="connectionString">鏈接字符串</param> /// <returns></returns> public bool UpdateEntity(User entity, string connectionString = null) { using (LightContext context = MySQLDataBaseConfig.CreateContext(connectionString)) { context.Update<User>(entity); return context.SaveChanges() > 0; } } }
/// <summary> /// 注入倉儲層 /// </summary> public class RepositoryInjection { public static void ConfigureRepository(IServiceCollection services) { //services.AddSingleton<IUserRepository, UserRepository>(); services.AddSingleton<IUserRepository, UserRepositoryMySql>(); } }
4、至此,你上層的所有代碼不用進行任何的變動,系統便從SqlServer切換到了MySql上。然后試着用API插入一個用戶信息看看,是不是User表自動創建,並且產生了一條記錄。

其實查看表結構不難發現,EF會默認將屬性名為Id的int型作為主鍵,並且設置為自增。字符串string類型的話默認可空且長度為255,其他則非空。那么我們是否可以修改默認的表結構呢,答案肯定是:可以的
三、配置上下文中的數據庫對象
1、在LightContext中重寫模型綁定的方法OnModelCreating,然后設置對應實體屬性的規則,這種方式叫做Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<User>(m => { m.Property(n => n.UserName).HasMaxLength(50);//設置用戶名最大長度為50個字符 m.Property(n => n.Password).HasMaxLength(20).IsRequired();//設置密碼不可空且最大20個字符 }); base.OnModelCreating(modelBuilder); }
2、本來想用Microsoft.EntityFrameworkCore.Tools結合dotnet ef相關命令直接進行更新數據庫,但最后失敗了

大致意思是說.NETStandard類庫不適用此CLI,除非換成啟動項目。然后查了下,官方也給出了解釋

3、所以我這邊偷了一個懶,直接刪除剛剛生成的表,然后重新運行項目,這相當於重建了數據庫表。接着查詢下MySQL中User表的新結構,看看是不是已經發生了變化

四:總結
其實EF Core還有更多高級的用法,實體模型間的關系,數據庫的遷移等等,需要我們更加深入的學習和實踐。除了官方文檔外,這里安利一個挺不錯的學習網站:learnentityframeworkcore,那么就到這里了,共同進步!
