ASP.NET Core:使用EntityFrameworkCore操作MySql來豐富倉儲模塊


概述

上一篇簡單介紹了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,那么就到這里了,共同進步!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM