📜  脚手架 dbcontext 覆盖 (1)

📅  最后修改于: 2023-12-03 15:27:42.361000             🧑  作者: Mango

脚手架 DbContext 覆盖

在 ASP.NET Core 项目中,使用 Entity Framework Core 时,我们通常需要手动添加 DbContext 类并配置其连接字符串和实体集合,这对于大型项目来说非常繁琐。ASP.NET Core 框架提供了一种脚手架工具,称为 Scaffold-DbContext,用于生成DbContext类和实体类型的代码。

什么是 Scaffold-DbContext?

Scaffold-DbContext 是 Entity Framework Core 中的一个命令行工具,它使用已经存在的数据库架构来手动创建 EF Core 模型(DbContext、实体类等)的脚手架代码。

其语法格式为:

Scaffold-DbContext "连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

其中,“连接字符串”是指向您的数据库的有效连接字符串,“Microsoft.EntityFrameworkCore.SqlServer” 是数据库提供程序名称,-OutputDir 是生成代码的目的地。

如何使用 Scaffold-DbContext?

首先,您需要在 Visual Studio 菜单中选择“工具”>“NuGet 包管理器”>“程序包管理器控制台”打开控制台:

image

接下来,您需要安装 EF Core 迁移和 SQL Server 数据库提供程序。

Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.EntityFrameworkCore.SqlServer

然后,您需要使用 Scaffold-DbContext 创建 DbContext 类和实体类型。以下是为 AdventureWorks2019 数据库创建 DbContext 类和实体类型的示例:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=AdventureWorks2019;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

以上命令会在 Models 文件夹中创建所有与 AdventureWorks2019 数据库相关的实体类和 DbContext 类。

对 Scaffold-DbContext 生成的代码进行修改

Scaffold-DbContext 命令生成的代码包含一个 DbContext 类和一组实体类。您可以根据需要修改 DbContext 类和实体类,添加表之间的关系,并将 Fluent API 配置添加到 OnModelCreating 方法中。这里有一个 AdventureWorks2019 数据库的 EF Core 数据模型示例。

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

#nullable disable

namespace ScaffoldDbContextDemo.Models
{
    public partial class AdventureWorks2019Context : DbContext
    {
        public AdventureWorks2019Context()
        {
        }

        public AdventureWorks2019Context(DbContextOptions<AdventureWorks2019Context> options)
            : base(options)
        {
        }

        public virtual DbSet<Department> Departments { get; set; }
        public virtual DbSet<Employee> Employees { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=AdventureWorks2019;Trusted_Connection=True;");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Department>(entity =>
            {
                entity.ToTable("Department");

                entity.Property(e => e.DepartmentId)
                    .ValueGeneratedNever()
                    .HasColumnName("DepartmentID");

                entity.Property(e => e.GroupName)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.ModifiedDate)
                    .HasColumnType("datetime")
                    .HasDefaultValueSql("(getdate())");

                entity.Property(e => e.Name)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);
            });

            modelBuilder.Entity<Employee>(entity =>
            {
                entity.ToTable("Employee");

                entity.Property(e => e.BusinessEntityId)
                    .ValueGeneratedNever()
                    .HasColumnName("BusinessEntityID");

                entity.Property(e => e.BirthDate).HasColumnType("date");

                entity.Property(e => e.Gender)
                    .IsRequired()
                    .HasMaxLength(1)
                    .IsUnicode(false)
                    .IsFixedLength(true);

                entity.Property(e => e.HireDate).HasColumnType("date");

                entity.Property(e => e.JobTitle)
                    .IsRequired()
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.LoginId)
                    .IsRequired()
                    .HasMaxLength(256)
                    .HasColumnName("LoginID")
                    .IsUnicode(false);

                entity.Property(e => e.MaritalStatus)
                    .IsRequired()
                    .HasMaxLength(1)
                    .IsUnicode(false)
                    .IsFixedLength(true);

                entity.Property(e => e.ModifiedDate)
                    .HasColumnType("datetime")
                    .HasDefaultValueSql("(getdate())");

                entity.Property(e => e.NationalIdnumber)
                    .IsRequired()
                    .HasMaxLength(15)
                    .HasColumnName("NationalIDNumber")
                    .IsUnicode(false);

                entity.Property(e => e.OrganizationLevel).HasColumnType("smallint");

                entity.Property(e => e.OrganizationNodeId).HasColumnName("OrganizationNodeID");

                entity.Property(e => e.SalariedFlag)
                    .IsRequired()
                    .HasMaxLength(1)
                    .IsUnicode(false)
                    .IsFixedLength(true);

                entity.Property(e => e.SickLeaveHours).HasDefaultValueSql("((0))");

                entity.Property(e => e.VacationHours).HasDefaultValueSql("((0))");

                entity.HasOne(d => d.Department)
                    .WithMany(p => p.Employees)
                    .HasForeignKey(d => d.DepartmentId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK_Employee_Department");
            });

            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}
总结

在本文中,我们介绍了如何使用 Scaffold-DbContext 工具来自动创建 EF Core 模型(DbContext、实体类等)。我们还演示了如何修改 Scaffold-DbContext 生成的代码,以满足我们的需要。无论您是为新项目创建 EF Core 数据库首选项还是需要在现有数据库架构上工作,使用 Scaffold-DbContext 工具都可以大大提高您的工作效率。