zoukankan      html  css  js  c++  java
  • 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】项目结构如下:

     

    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.EFCoreCodeFirstStarts2000.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】项目设置为启动项目,编译运行:

    参考文章:

    1. https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/migrations
    2. https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql
  • 相关阅读:
    MVC模式 与 Model2模型 介绍
    通过Servlet获取初始化参数
    《算法竞赛入门经典》学习笔记 2.3 文件操作
    《C++ Primer Plus》学习笔记 2.1.1 main()函数
    Codeforces Round #359 (Div. 2) C. Robbers' watch 搜索
    Github Pages建立个人博客
    《算法竞赛入门经典》第一章 程序设计入门 习题
    《C++ Primer Plus》学习笔记 第1章 预备知识
    在C#代码中应用Log4Net(一)简单使用Log4Net
    NHibernate实例
  • 原文地址:https://www.cnblogs.com/Starts_2000/p/mysql-efcore20-codefirst-dbfirst-migration-demo.html
Copyright © 2011-2022 走看看