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】項目結構如下:
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
如果命令執行成功,可以看到項目目錄中新增了如下內容:
7、執行 dotnet ef database update
命令
執行成功后,可以看到數據庫及表創建成功。
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
命令:
如果命令執行成功,可以看到項目目錄中新增了如下內容:
接着按照 步驟7 的操作,如果成功,可以看到 User 表已經創建了 Account 的唯一索引:
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】項目設置為啟動項目,編譯運行:
三、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"
執行成功后,項目增加了如下內容:
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】項目設置為啟動項目,編譯運行:
參考文章: