Entity Framework Core使用控制台程序生成数据库表

目录
  • 一、引言
    • 1、添加实体类
    • 2、添加Mircosoft.EntityFrameworkCore
  • 二、生成数据库表
    • 1、代码生成
    • 2、程序包管理器控制台迁移
      • 1、安装Microsoft.EntityFrameworkCore.Tools包
      • 2、添加迁移
      • 3、更新数据库
    • 3、命令行迁移

一、引言

我们使用Code First的方式来生成数据库表,我们先讲解如何在控制台项目中生成数据库表。

在前面的文章中,我们是直接在控制台项目中安装的Mircosoft.EntityFrameworkCore,在真实的项目中,我们很少这样使用,都是采用分层的结构,将EF Core有关的操作放在一个单独的类库项目里,下面的例子中我们就以这种分层的结构来进行讲解。项目结构如下图所示:

项目结构:

  • EFCoreTest.Con:控制台项目,用来运行程序,在项目中会引用EFCoreTest.Data。
  • EFCoreTest.Data:类库项目,基于.Net Standard。存放的是与EF Core相关的内容。
  • EFCoreTest.Model:类库项目,基于.Net Standard。存放项目中使用到的实体类。

1、添加实体类

我们首先在EFCoreTest.Model类库项目里添加Student实体:

namespace EFCoreTest.Model
{
    public class Student
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public int Gender { get; set; }
    }
}

2、添加Mircosoft.EntityFrameworkCore

我们在EFCoreTest.Data类库里面添加Mircosoft.EntityFrameworkCore包:

我们使用SqlServer数据库,所以我们还要安装Microsoft.EntityFrameworkCore.sqlServer包:

安装完成以后我们添加EFCoreTest.Model的引用,然后添加数据上下文类,该类继承自DbContext:

using EFCoreTest.Model;
using Microsoft.EntityFrameworkCore;

namespace EFCoreTest.Data
{
    /// <summary>
    /// 数据上下文类,继承自DbContext
    /// </summary>
    public class EFCoreDbContext:DbContext
    {
        /// <summary>
        /// 重写OnConfiguring方法
        /// </summary>
        /// <param name="optionsBuilder"></param>
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // 使用SqlServer数据库,传递连接字符串
            optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=EFTestDb;User ID=sa;Password=123456;");
            base.OnConfiguring(optionsBuilder);
        }

        /// <summary>
        /// 重写OnModelCreating,主要做一些配置
        /// 例如设置生成的表名、主键、字符长度
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // 设置生成的表名
            modelBuilder.Entity<Student>().ToTable("T_Student");
            // 设置主键,可以不设置,会默认把Id字段当成主键
            modelBuilder.Entity<Student>().HasKey(p => p.Id);
            // 设置Name字段的最大长度
            modelBuilder.Entity<Student>().Property("Name").HasMaxLength(32);
            base.OnModelCreating(modelBuilder);
        }

        // DbSet属性
        public DbSet<Student> Students { get; set; }
    }
}

这些工作做好以后,我们就可以用来生成数据库表了。

二、生成数据库表

我们下面以三种方式来生成数据库表。首先在控制台项目中添加EFCoreTest.Data的引用。

1、代码生成

我们可以使用代码来生成数据库,这样在程序启动的时候调用生成数据库的代码就能自动生成数据库了。代码如下:

using EFCoreTest.Data;
using System;

namespace EFCoreTest.Con
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            EFCoreDbContext dbContext = new EFCoreDbContext();
            bool tfTrue = dbContext.Database.EnsureCreated();
            if (tfTrue)
            {
                Console.WriteLine("数据库创建成功!");
            }
            else
            {
                Console.WriteLine("数据库创建失败!");
            }

            Console.ReadKey();
        }
    }
}

运行程序:

输出结果提示我们创建成功了,在去数据库里面看看:

我们看到数据库和表都已经生成了,而且表里面的字段属性是按照我们在代码里面的设置生成的。

注意:如果这时候在程序启动的时候在去生成数据库就会报错:

2、程序包管理器控制台迁移

除了使用代码的方式生成,我们还可以使用数据迁移命令来生成数据库表,分为下面的三个步骤。

1、安装Microsoft.EntityFrameworkCore.Tools包

要使用数据迁移命令,首先需要安装Microsoft.EntityFrameworkCore.Tools包:

2、添加迁移

首先在数据上下文类的OnModelCreating()方法里面添加一些种子数据,这样生成数据库以后,表里面就有一些基础数据:

using EFCoreTest.Model;
using Microsoft.EntityFrameworkCore;

namespace EFCoreTest.Data
{
    /// <summary>
    /// 数据上下文类,继承自DbContext
    /// </summary>
    public class EFCoreDbContext:DbContext
    {
        /// <summary>
        /// 重写OnConfiguring方法
        /// </summary>
        /// <param name="optionsBuilder"></param>
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            // 使用SqlServer数据库,传递连接字符串
            optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=EFTestDb;User ID=sa;Password=123456;");
            base.OnConfiguring(optionsBuilder);
        }

        /// <summary>
        /// 重写OnModelCreating,主要做一些配置
        /// 例如设置生成的表名、主键、字符长度
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // 设置生成的表名
            modelBuilder.Entity<Student>().ToTable("T_Student");
            // 设置主键,可以不设置,会默认把Id字段当成主键
            modelBuilder.Entity<Student>().HasKey(p => p.Id);
            // 设置Name字段的最大长度
            modelBuilder.Entity<Student>().Property("Name").HasMaxLength(32);

            base.OnModelCreating(modelBuilder);

            // 添加种子数据
            modelBuilder.Entity<Student>().HasData(
                new Student()
                {
                    Id = 1,
                    Name = "Tom",
                    Age = 24,
                    Gender = 1
                },
                new Student()
                {
                    Id = 2,
                    Name = "Jack",
                    Age = 23,
                    Gender = 2
                },
                new Student()
                {
                    Id = 3,
                    Name = "Kevin",
                    Age = 26,
                    Gender = 2
                }
                );
        }

        // DbSet属性
        public DbSet<Student> Students { get; set; }
    }
}

然后使用下面的命令来添加迁移:

Add-Migration Initial
  • Add-Migration:是迁移命令。
  • Initial:可以理解成是给这次迁移起的一个别名,这个名称可以任意起,只要保证每次迁移的时候不重名即可。

如下图所示:

执行这条命令:

我们看到执行报错了,报错信息提示我们程序的启动项里面也要安装Mircosoft.EntityFrameworkCore.Tools包,我们在控制台程序里面安装这个包,然后在执行迁移命令:

可以看到,这次执行成功了。成功以后会生成一个Migrations文件夹,这个文件夹下面有两个类文件:

20200223132908_Init.cs文件是根据这次迁移生成的文件,里面记录着这次迁移发生的改变:

using Microsoft.EntityFrameworkCore.Migrations;

namespace EFCoreTest.Data.Migrations
{
    public partial class Init : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.CreateTable(
                name: "T_Student",
                columns: table => new
                {
                    Id = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:Identity", "1, 1"),
                    Name = table.Column<string>(maxLength: 32, nullable: true),
                    Age = table.Column<int>(nullable: false),
                    Gender = table.Column<int>(nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_T_Student", x => x.Id);
                });

            migrationBuilder.InsertData(
                table: "T_Student",
                columns: new[] { "Id", "Age", "Gender", "Name" },
                values: new object[] { 1, 24, 1, "Tom" });

            migrationBuilder.InsertData(
                table: "T_Student",
                columns: new[] { "Id", "Age", "Gender", "Name" },
                values: new object[] { 2, 23, 2, "Jack" });

            migrationBuilder.InsertData(
                table: "T_Student",
                columns: new[] { "Id", "Age", "Gender", "Name" },
                values: new object[] { 3, 26, 2, "Kevin" });
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropTable(
                name: "T_Student");
        }
    }
}

里面有下面的两个方法:

  • Up:该方法是要应用到数据库的配置。
  • Down:该方法相当于是做回滚操作,执行这个方法,可以恢复到上一个状态。

每进行一次迁移就会生成一个这样的文件。

EFCoreDbContextModelSnapshot.cs是根据在OnModelCreating()方法中的配置生成的文件:

// <auto-generated />
using EFCoreTest.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;

namespace EFCoreTest.Data.Migrations
{
    [DbContext(typeof(EFCoreDbContext))]
    partial class EFCoreDbContextModelSnapshot : ModelSnapshot
    {
        protected override void BuildModel(ModelBuilder modelBuilder)
        {
#pragma warning disable 612, 618
            modelBuilder
                .HasAnnotation("ProductVersion", "3.1.2")
                .HasAnnotation("Relational:MaxIdentifierLength", 128)
                .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

            modelBuilder.Entity("EFCoreTest.Model.Student", b =>
                {
                    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("int")
                        .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);

                    b.Property<int>("Age")
                        .HasColumnType("int");

                    b.Property<int>("Gender")
                        .HasColumnType("int");

                    b.Property<string>("Name")
                        .HasColumnType("nvarchar(32)")
                        .HasMaxLength(32);

                    b.HasKey("Id");

                    b.ToTable("T_Student");

                    b.HasData(
                        new
                        {
                            Id = 1,
                            Age = 24,
                            Gender = 1,
                            Name = "Tom"
                        },
                        new
                        {
                            Id = 2,
                            Age = 23,
                            Gender = 2,
                            Name = "Jack"
                        },
                        new
                        {
                            Id = 3,
                            Age = 26,
                            Gender = 2,
                            Name = "Kevin"
                        });
                });
#pragma warning restore 612, 618
        }
    }
}

3、更新数据库

执行完上面的步骤,我们执行更新数据库的命令:

Update-Database

如下图所示:

执行成功,查看数据库数据:

T_Student表已经生成了,而且表里面也有添加的种子数据,到此迁移就完成了。

3、命令行迁移

除了上面的两种方式,还可以使用命令行进行迁移,这种方式主要在Web项目里面比较常用。

使用下面的命令安装:

dotnet tool install --global dotnet-ef

如下图所示:

安装完成以后我们在执行命令:

因为我本机的.NET SDK的版本是3.1.1,刚才安装的dotent-ef的版本是3.1.2,版本不兼容,我们下载最新的.NET SDK,然后安装。

到此这篇关于Entity Framework Core使用控制台程序生成数据库表的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • EFCore 通过实体Model生成创建SQL Server数据库表脚本

    在我们的项目中经常采用Model First这种方式先来设计数据库Model,然后通过Migration来生成数据库表结构,有些时候我们需要动态通过实体Model来创建数据库的表结构,特别是在创建像临时表这一类型的时候,我们直接通过代码来进行创建就可以了不用通过创建实体然后迁移这种方式来进行,其实原理也很简单就是通过遍历当前Model然后获取每一个属性并以此来生成部分创建脚本,然后将这些创建的脚本拼接成一个完整的脚本到数据库中去执行就可以了,只不过这里有一些需要注意的地方,下面我们来通过代码来一

  • .Net Core Aop之IResourceFilter的具体使用

    目录 一.简介 二.IResourceFilter(同步资源缓存) 1.定义Filter 三.IAsyncResourceFilter(异步资源缓存) 四.总结 一.简介 在.net core 中Filter分为以下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执行方法前后的记录) 4.IResultFilter(结果生成前后扩展) 5.IAlwaysRun(响应结果的补充) 6.IExceptio

  • ASP.NET Core使用EF SQLite对数据库增删改查

    SQLIte 操作方便,简单小巧,这里笔者就不再过多介绍,感兴趣可以到以下博文 https://www.jb51.net/article/234142.htm 文章介绍创建ASP.NET Core 程序,创建模型.上下文,生成数据库,对数据库增删查改. 并对每个过程进行详细介绍,使初学者尽快了解内容和相关知识,避免对某一知识点怀疑.卡在某个位置. 1 新建ASP.NET Core MVC 应用 1.1 新建MVC应用 打开Visual Studio 2017,新建 ASP.NET Web应用程序

  • ASP.Net Core基于EF6、Unitwork、Autofac实现Repository模式

    一.实现的思路和结构图 Repository的共同性 有一些公共的方法(增删改查), 这些方法无关于Repository操作的是哪个实体类,可以把这些方法定义成接口IRepository,然后有个基类BaseRepository实现该接口的方法.常见的方法,比如Find, Filter, Delete, Create等 Repository的差异性 每个Repository类又会有一些差异性,应当允许它们能够继承BaseRepository之外,还能够再扩展自己的一些方法.所以每个类都可以再定义

  • ASP.NET Core托管模型CreateDefaultBuilder()方法

    让我们讨论一下 CreateDefaultBuilder() 方法究竟对配置和设置 Web 服务器的作用.从托管的角度来看,一个ASP.NET Web 应用程序可以通过两种方式托管,即进程托管(InProcess)或进程外托管(OutOfProcess). 注:当我们使用任何模板创建新 ASP.NET Core Web 应用程序时,默认情况下,使用InProcess 托管创建项目文件,该托管用于在 IIS 或 IIS Express 方案中托管应用程序. 如何验证是否在进程内? 为了验证上面的观

  • .NET Core使用EF生成数据库出错的解决方法

    在.NET Core 项目钟(类库),使用Entity Framework,建立模型生成数据库时,失败 Could not load assembly 'xxx'. Ensure it is referenced by the startup project 'xxx'. 改成 64 位即可 假设 ef 代码 public class ApplicationDbContext : IdentityDbContext<User> { public ApplicationDbContext(DbC

  • C# EF Core可视化工具的使用及EF Core入门语句操作代码

    目录 前言 一.EFCoreTools的下载 二.EFCoreTools的使用 1.新建项目并引入EFCoreTools 2.手动引入EFCore的包 三.EFCore的填查删改 1.添加操作 2.查找操作 3.删除操作 4.修改操作 四.总结 前言 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术. 一.EF Core Tools的下载 EFCore Tools可视化工具下载后安装,并重启ViusalS

  • EF Core通过显式编译提高查询性能

    今天,我将向您展示这些EF Core中一个很酷的功能,通过使用显式编译的查询,提高查询性能. 不过在介绍具体内容之前,需要说明一点,EF Core已经对表达式的编译使用了缓存:当您的代码需要重用以前执行的查询时,EF Core将使用哈希查找并从缓存中返回已编译的查询. 不过,您可能希望直接对查询进行编译,跳过哈希的计算和缓存查找.我们可以通过在EF静态类中下面两个方法来实现: EF.CompileQuery() EF.CompileAsyncQuery() 这些方法允许您定义一个已编译的查询,然

  • Entity Framework Core使用控制台程序生成数据库表

    目录 一.引言 1.添加实体类 2.添加Mircosoft.EntityFrameworkCore 二.生成数据库表 1.代码生成 2.程序包管理器控制台迁移 1.安装Microsoft.EntityFrameworkCore.Tools包 2.添加迁移 3.更新数据库 3.命令行迁移 一.引言 我们使用Code First的方式来生成数据库表,我们先讲解如何在控制台项目中生成数据库表. 在前面的文章中,我们是直接在控制台项目中安装的Mircosoft.EntityFrameworkCore,在

  • Entity Framework Core对Web项目生成数据库表

    一.引言 这篇文章中我们讲解如何在Web项目中使用EntityFrameworkCore,并生成数据库表,这里以ASP.NET Core WebApi为例讲解.还是采用分层的结构.创建后的项目整体结构如下图所示: 项目结构: EFCoreWeb.API:ASP.NET Core WebApi项目,用来提供Web功能,在项目中会引用EFCoreWeb.Data. EFCoreWeb.Data:类库项目,基于.NET Core的类库.存放的是与EFCore相关的操作. EFCoreWeb.Model

  • Entity Framework Core生成数据库表

    目录 一.引言 二.具体示例 1.代码生成 2.程序包管理器控制台迁移 1.安装Microsoft.EntityFrameworkCore.Tools包 2.添加迁移命令 3.更新数据库 3.命令行迁移 1.添加迁移 2.更新数据库 三.总结 一.引言 生成数据库表有下面的三种方式: 代码生成. 程序包管理器控制台迁移. 命令行迁移. 下面分别介绍上面的三种方法. 二.具体示例 1.代码生成 在程序里面执行下面的代码可以在运行时生成数据库: dbContext.Database.EnsureCr

  • Entity Framework Core表名映射

    表名映射 我们知道:如果是在默认情况下,使用EFCore Code First的方式生成的表名跟数据上下文类中定义的实体属性的名称是一致的,例如: public DbSet<Blog> Bloges123 { get; set; } 这里定义的属性名称是Bloges123,那么最后数据库中生成的表名也叫Bloges123.看下面的测试. 我们首先添加迁移,每次迁移都会生成一个对应的迁移记录类,代码如下图所示: 可以看到,这里显示创建表的名称就是Bloges123.最后更新数据库,更新完成以后查

  • Entity Framework Core基于数据模型创建数据库

    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序.使用迁移(Migrations)基于数据模型创建数据库,你可以在Windows上使用Visual Studio 2017 PowerShell或在Windows.macOS或Linux上使用.NET Core CLI来学习创建数据库. 2.创建新项目 2.1系统必备 在创建新项目之前都要检查是否安装以下软件:●具有以下工作负载的Visual Studio 2017 15.7版或

  • Entity Framework Core关联删除

    目录 数据库关联删除行为 定义实体 Fluent API 配置关联实体 创建表结构 EF Core 关联实体删除行为 总结 DeleteBehavior.Cascade DeleteBehavior.SetNull DeleteBehavior.ClientSetNull DeleteBehavior.Restrict 关联删除通常是一个数据库术语,用于描述在删除行时允许自动触发删除关联行的特征:即当主表的数据行被删除时,自动将关联表中依赖的数据行进行删除,或者将外键更新为NULL或默认值. 数

  • Entity Framework Core工具使用命令行

    命令列表 Cmdlet Description -------------------------- --------------------------------------------------- Add-Migration Adds a new migration. Drop-Database Drops the database. Get-DbContext Gets information about a DbContext type. Remove-Migration Remov

  • Entity Framework Core生成列并跟踪列记录

    注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布时,功能可能存在变动. 当您设计数据库时,有时需要添加列以跟踪记录何时更改,以及谁进行了更改.例如,您添加以下列: CreatedAt CreatedBy LastUpdatedAt LastUpdatedBy 您可以轻松地使用默认值和触发器来处理CreatedAt和LastUpdatedAt列.老实说,创建触发器是件无聊的事情,你也不想自己做.此外,很难设置用户名,因为

  • Entity Framework Core实现Like查询详解

    在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用. 不过Entity Framework 中默认提供了StartsWith.Contains和EndsWith方法用于解决模糊查询,那么为什么还要提供EF.Functions.Like,今天我们来重点说说它们之间的区别. 表结构定义 在具体内容开始之前,我们先简单说明一下要使用的表结构. public class C

  • Entity Framework Core中执行SQL语句和存储过程的方法介绍

    无论ORM有多么强大,总会出现一些特殊的情况,它无法满足我们的要求.在这篇文章中,我们介绍几种执行SQL的方法. 表结构 在具体内容开始之前,我们先简单说明一下要使用的表结构. public class Category { public int CategoryID { get; set; } public string CategoryName { get; set; } } 在Category定义了两个字段:CategoryID.CategoryName. public class Sam

随机推荐