天天看點

EF Code First 連接配接MySql

看了很多文章,嘗試了很多次總是進行不下去,整理一下,以便日後檢視。

1、建立ASP.NET MVC項目(EFCodeFirst)

  1.1、右鍵點選引用選擇管理NuGet程式包下載下傳MySql.Data.Entity.dll(有依懶項,會自動下載下傳MySql.Data.dl 和 EntityFramework.dll)

  1.2、修改Web.config檔案(如下圖)

  

EF Code First 連接配接MySql
EF Code First 連接配接MySql

2、建立類庫(EFCodeFirst.DataAccess)

  2.1、右鍵添加-->建立項-->選擇資料-->選擇ADO.NET實體資料模型-->空Code First模型(也可以不用這一步,但DatabaseAccess.cs檔案需要自己建立)

  2.1、右鍵點選引用選擇管理NuGet程式包下載下傳MySql.Data.Entity.dll(有依懶項,會自動下載下傳MySql.Data.dl 如下圖)

    

EF Code First 連接配接MySql

  2.2、修改檔案 DatabaseAccess.cs

    修改之前:

    

EF Code First 連接配接MySql

    修改之後:

    

EF Code First 連接配接MySql

     代碼如下:

    

namespace EFCodeFirst.DataAccess
{
    using IdentityAuth.Common;
    using IdentityAuth.Model.Sys;
    using MySql.Data.MySqlClient;
    using System;
    using System.Data.Common;
    using System.Data.Entity;
    using System.Linq;

    public class DatabaseAccess : DbContext
    {
        #region 構造函數和初始化
        private static string connectionStr { get; set; }
        private static DbConnection GetConnection()
        {
            if (String.IsNullOrEmpty(connectionStr))
                connectionStr = ConfigHelper.GetConnectionStr("EFCodeFirst");

            if (String.IsNullOrEmpty(connectionStr))
                throw new Exception("資料庫連接配接字元串為空,請在Config檔案裡配置");

            DbConnection dbConnection = new MySqlConnection() { ConnectionString = connectionStr };
            return dbConnection;
        }

        public DatabaseAccess() : base(DatabaseAccess.GetConnection(), true)
        {
            Database.SetInitializer<DatabaseAccess>(null);
        }
        #endregion

        #region 系統表
        /// <summary>
        /// 系統使用者資訊
        /// </summary>
        public DbSet<SysUserEntity> UserEntities { get; set; }

        /// <summary>
        /// 角色資訊
        /// </summary>
        public DbSet<SysRoleEntity> RoleEntities { get; set; }

        /// <summary>
        /// 系統菜單資訊
        /// </summary>
        public DbSet<SysMenuEntity> MenuEntities { get; set; }

        /// <summary>
        /// 角色權限資訊
        /// </summary>
        public DbSet<SysRoleAuthEntity> RoleAuthEntities { get; set; }

        /// <summary>
        /// 角色使用者資訊
        /// </summary>
        public DbSet<SysRoleUserEntity> RoleUserEntities { get; set; }

        #endregion
    }
}      

    2.3、修改App.config檔案(如下圖)

     

EF Code First 連接配接MySql

    

    App.config檔案如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.10.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
  </startup>
</configuration>      

 3、遷移

   3.1、打開程式包管理控制器,預設項目選擇 EFCodeFirst.DataAccess(也就是CodeFirst遷移目錄,如下圖)

   

EF Code First 連接配接MySql

  

  3.2、添加遷移配置 Enable-Migrations(生成以下檔案并會出現錯誤,如圖)

   

EF Code First 連接配接MySql

    

EF Code First 連接配接MySql

  3.3、解決3.2出現的錯誤,修改生成檔案 Configuration.cs(如下圖)

   

EF Code First 連接配接MySql

    代碼如下:

  

namespace EFCodeFirst.DataAccess.Migrations
{
    using System;
    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Data.Entity.Migrations.History;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<EFCodeFirst.DataAccess.DatabaseAccess>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());
            SetHistoryContextFactory("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));
        }

        protected override void Seed(EFCodeFirst.DataAccess.DatabaseAccess context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
        }
    }

    public class MySqlHistoryContext : HistoryContext
    {

        public MySqlHistoryContext(DbConnection connection, string defaultSchema)
            : base(connection, defaultSchema)
        {}

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();
            modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();
        }
    }
}      

  

  3.4、添加一個合并遷移指令行:Add-Migration [Name](eg:Add-Migration Add_Base_Table) Name 為一個合并的名稱,自定義,最好不重複

  

EF Code First 連接配接MySql

    3.5、生成SQL:Update-Database -Script(如果不需要SQL可不用執行)

  3.6、遷移到資料庫:Update-Database

  

EF Code First 連接配接MySql