1. 程式人生 > >MySql 使用 EF Core 2.0 CodeFirst、DbFirst、資料庫遷移(Migration)介紹及示例

MySql 使用 EF Core 2.0 CodeFirst、DbFirst、資料庫遷移(Migration)介紹及示例

dotnet core 2.0 釋出已經好幾天了,期間也把原來 dotnet core 1.1 的 MVC 專案升級到了 2.0,升級過程還是比較順利的,變動也不是太多。升級的過程中也少不了 Entity Framwork Core 的升級,在這篇文章中主要介紹下 MySql 資料庫使用 Entity Framwork Core 2.0 如何進行 Code First、Database First 及資料庫遷移(Migration),雖然比較基礎,但是做到儘量詳細。本文所有示例程式碼已經提交到 GitHub:https://github.com/starts2000/EFCoreDemo,如果覺得對你有幫助,就給個 Star 吧。

一、工具及環境

  • Visual Studio 2017 15.3

  • .NET CORE 2.0 SDK

二、Entity Framwork Core 2.0 MySql Code First 及 資料庫遷移(Migration)

1、建立 .NET Core 類庫專案 【Starts2000.EFCoreCodeFirst】

2、新增 User 實體類

    public class User
    {       
 
public int Id { get; set; }        [MaxLength(32), Required]      
 
public string Aaccount { get
; set; }        [MaxLength(32), Required]    
   
public string Password { get; set; }    }

最終【Starts2000.EFCoreCodeFirst】專案結構如下:

 640?wx_fmt=png

3、建立 .NET Core 控制檯應用專案 【Starts2000.EFCoreCodeFirst.Test】

  • 新增對 【Starts2000.EFCoreCodeFirst】專案的引用;

  • Nuget 新增 Microsoft.EntityFrameworkCore.Tools 及 Pomelo.EntityFrameworkCore.MySql(注意勾上:包括預發行版

    ) 的引用;

4、編輯 Starts2000.EFCoreCodeFirst.Test.csproj 專案檔案,新增如下內容:

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /></ItemGroup>

最終內容如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <ApplicationIcon />
    <OutputType>Exe</OutputType>
    <StartupObject />
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Starts2000.EFCoreCodeFirst\Starts2000.EFCoreCodeFirst.csproj" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.0-rtm-10058" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup></Project>

 5、新增 TestDbContext 類(注意:把資料庫連線字串修改為自己的

    public class TestDbContext : DbContext
    {       
 
public DbSet<User> User { get; set; }      

 
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UseMySql(                "server=localhost;database=TestDb;user=test;password=123456;");        }        

protected override void OnModelCreating(ModelBuilder modelBuilder)        {          
 
base.OnModelCreating(modelBuilder);            //modelBuilder.Entity<User>().HasIndex(u => u.Aaccount).IsUnique();        }    }

6、開啟命令列視窗,切換到 【Starts2000.EFCoreCodeFirst.Test】專案資料夾目錄,執行如下命令:

dotnet ef migrations add InitialCreate

 640?wx_fmt=png

如果命令執行成功,可以看到專案目錄中新增瞭如下內容:

640?wx_fmt=png

7、執行 dotnet ef database update  命令

640?wx_fmt=png

執行成功後,可以看到資料庫及表建立成功。

640?wx_fmt=png

 8、修改實體,並把修改的內容更新到資料庫

 User 類的 Account 屬性對應 User 表的 Account 列應該是唯一的,前面忘記了設定唯一索引,現在在 TestDbContext 中加上:

    public class TestDbContext : DbContext
    {       
 
public DbSet<User> User { get; set; }    

   
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)        {            optionsBuilder.UseMySql(                "server=localhost;database=TestDb;user=test;password=123456;");        }        

protected override void OnModelCreating(ModelBuilder modelBuilder)        {          
 
base.OnModelCreating(modelBuilder);            modelBuilder.Entity<User>().HasIndex(u => u.Aaccount).IsUnique();        }    }

執行 dotnet ef migrations add UserTableUpdateAccount 命令:

640?wx_fmt=png

如果命令執行成功,可以看到專案目錄中新增瞭如下內容:

640?wx_fmt=png

接著按照 步驟7 的操作,如果成功,可以看到 User 表已經建立了 Account 的唯一索引:

640?wx_fmt=png

9、測試資料寫入和讀取

在 Main 函式中新增如下程式碼:

        static void Main(string[] args)
        {         
   
using(var context = new TestDbContext())            {                context.User.Add(new Models.User                {                    Aaccount = "CodeFirst-Test-" + DateTime.Now.ToString("yyyyMMddHHmmssfff"),                    Password = "123456"                });                context.SaveChanges();                Console.WriteLine(context.User                    .OrderByDescending(u => u.Id)                    .FirstOrDefault()?.Aaccount);            }            Console.ReadKey();        }

把【Starts2000.EFCoreCodeFirst.Test】專案設定為啟動專案,編譯執行:

640?wx_fmt=png

三、Entity Framwork Core 2.0 MySql Database First

1、新建 【Starts2000.EFCoreDbFirst】 專案

2、Nuget 新增 Pomelo.EntityFrameworkCore.MySql(注意勾上:包括預發行版) 的引用;

3、編輯 Starts2000.EFCoreDbFirst.csproj 專案檔案,新增如下內容:

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>

最終內容如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.0-rtm-10057" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup></Project>

 4、開啟命令列視窗,切換到 【Starts2000.EFCoreDbFirst】專案資料夾目錄,執行如下命令:

dotnet ef dbcontext scaffold "Server=localhost;User Id=test;Password=123456;Database=TestDb" "Pomelo.EntityFrameworkCore.MySql"

執行成功後,專案增加了如下內容:

640?wx_fmt=png

5、建立 .NET Core 控制檯應用專案 【Starts2000.EFDbFirst.Test】進行測試

  • 新增對 【Starts2000.EFCoreDbFirst】專案的引用;

  • 把 Main 函式修改為如下程式碼:

static void Main(string[] args)
{         
   
using (var context = new TestDbContext())            {                context.User.Add(new User                {                    Aaccount = "DbFirst-Test-" + DateTime.Now.ToString("yyyyMMddHHmmssfff"),                    Password = "123456"                });                context.SaveChanges();                Console.WriteLine(context.User                    .OrderByDescending(u => u.Id)                    .FirstOrDefault()?.Aaccount);            }            Console.ReadKey();        }
  • 把【Starts2000.EFCoreDbFirst.Test】專案設定為啟動專案,編譯執行:

640?wx_fmt=png

參考文章:

  1. https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/migrations

  2. https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

相關文章: 

原文地址:http://www.cnblogs.com/Starts_2000/p/mysql-efcore20-codefirst-dbfirst-migration-demo.html

.NET社群新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

640?wx_fmt=jpeg