我的编程空间,编程开发者的网络收藏夹
学习永远不晚

EntityFrameworkCore使用控制台程序生成数据库表

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

EntityFrameworkCore使用控制台程序生成数据库表

一、引言

我们使用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使用控制台程序生成数据库表的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

EntityFrameworkCore使用控制台程序生成数据库表

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍了Entity Framework Core如何使用控制台程序生成数据库表,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、引言我们使用Code First的
2023-06-29

.NET5控制台程序如何使用EF连接MYSQL数据库

小编给大家分享一下.NET5控制台程序如何使用EF连接MYSQL数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.使用nuget下载:Microsoft.E
2023-06-20

使用SMO程序化生成SQL Server表数据

作为ETL的一部分,有时候就是需要把数据的Insert脚本生成出来,然后人肉拷贝到另一个地方执行。熟悉SMSS的同学们都知道,有个生成脚本的任务,可以生成数据库的create脚本啊什么的,其实也能够生产表中的数据。自动化的ETL总不能连导出数据都人肉。。。一是
使用SMO程序化生成SQL Server表数据
2017-03-24

怎么使用PyQt5制作一个数据图表生成器

这篇文章主要介绍了怎么使用PyQt5制作一个数据图表生成器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我的需求:手动配置X轴、Y轴、图表标题等参数自动通过Pyecharts
2023-06-29

如何使用Entity Framework Core对Web项目生成数据库表

小编给大家分享一下如何使用Entity Framework Core对Web项目生成数据库表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、引言这篇文章中我们讲解如何在Web项目中使用EntityFrameworkCor
2023-06-29

使用花哨标题生成器优化你的数据库内容表现

花哨标题生成器:提升你的数据库内容的可读性和搜索引擎优化表现
使用花哨标题生成器优化你的数据库内容表现
2024-02-18

基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】

1、项目简介 本项目是一套基于JavaSE+JDBC使用控制台操作的简易购物系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经
基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】
2023-12-23

我们如何使用 mysqldump 客户端程序从数据库中备份特定表?

通过使用 mysql dump 客户端程序,我们可以将数据库中的特定表备份到扩展名为“.sql”的文件中。可以通过以下示例来理解 -示例在这个示例中,借助 mysql dump 客户端程序,我们从名为“student_info.sql”的文
2023-10-22

给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之一:在WEBUI中实时输出服务器控制台日志

前言 目前数字人实现技术众多,我这里采用基于ER-NeRF,在这里可以看到其介绍:ICCV 2023 | ER-NeRF: 用于合成高保真Talking Portrait的高效区域感知神经辐射场-https://zhuanlan.zhihu
给数字人生成加上界面,基于ER-NeRF/RAD-NeRF/AD-NeRF,Gradio框架构建WEBUI,使用HLS流媒体,实现边推理边播放——之一:在WEBUI中实时输出服务器控制台日志
2023-12-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录