中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Entity?Framework?Core如何使用控制臺程序生成數據庫表

發布時間:2022-03-23 11:26:46 來源:億速云 閱讀:173 作者:小新 欄目:開發技術

這篇文章主要介紹了Entity Framework Core如何使用控制臺程序生成數據庫表,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、引言

我們使用Code First的方式來生成數據庫表,我們先講解如何在控制臺項目中生成數據庫表。

在前面的文章中,我們是直接在控制臺項目中安裝的Mircosoft.EntityFrameworkCore,在真實的項目中,我們很少這樣使用,都是采用分層的結構,將EF Core有關的操作放在一個單獨的類庫項目里,下面的例子中我們就以這種分層的結構來進行講解。項目結構如下圖所示:

Entity?Framework?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包:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

我們使用SqlServer數據庫,所以我們還要安裝Microsoft.EntityFrameworkCore.sqlServer包:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

安裝完成以后我們添加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();
        }
    }
}

運行程序:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

輸出結果提示我們創建成功了,在去數據庫里面看看:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

我們看到數據庫和表都已經生成了,而且表里面的字段屬性是按照我們在代碼里面的設置生成的。

注意:如果這時候在程序啟動的時候在去生成數據庫就會報錯:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

2、程序包管理器控制臺遷移

除了使用代碼的方式生成,我們還可以使用數據遷移命令來生成數據庫表,分為下面的三個步驟。

1、安裝Microsoft.EntityFrameworkCore.Tools包

要使用數據遷移命令,首先需要安裝Microsoft.EntityFrameworkCore.Tools包:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

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:可以理解成是給這次遷移起的一個別名,這個名稱可以任意起,只要保證每次遷移的時候不重名即可。

如下圖所示:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

執行這條命令:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

我們看到執行報錯了,報錯信息提示我們程序的啟動項里面也要安裝Mircosoft.EntityFrameworkCore.Tools包,我們在控制臺程序里面安裝這個包,然后在執行遷移命令:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

可以看到,這次執行成功了。成功以后會生成一個Migrations文件夾,這個文件夾下面有兩個類文件:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

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

如下圖所示:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

執行成功,查看數據庫數據:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

T_Student表已經生成了,而且表里面也有添加的種子數據,到此遷移就完成了。

3、命令行遷移

除了上面的兩種方式,還可以使用命令行進行遷移,這種方式主要在Web項目里面比較常用。

Entity?Framework?Core如何使用控制臺程序生成數據庫表

使用下面的命令安裝:

dotnet tool install --global dotnet-ef

如下圖所示:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

安裝完成以后我們在執行命令:

Entity?Framework?Core如何使用控制臺程序生成數據庫表

因為我本機的.NET SDK的版本是3.1.1,剛才安裝的dotent-ef的版本是3.1.2,版本不兼容,我們下載最新的.NET SDK,然后安裝。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Entity Framework Core如何使用控制臺程序生成數據庫表”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福海县| 出国| 子洲县| 南皮县| 太白县| 陆河县| 广元市| 富锦市| 天柱县| 乌鲁木齐县| 元朗区| 浑源县| 新乡县| 宝清县| 南乐县| 玉龙| 松滋市| 海丰县| 稻城县| 抚宁县| 招远市| 黄大仙区| 林西县| 娱乐| 白水县| 昌宁县| 通江县| 桑植县| 商城县| 集安市| 尼勒克县| 南岸区| 象山县| 连山| 永定县| 海伦市| 攀枝花市| 五河县| 冕宁县| 贡山| 和林格尔县|