📅  最后修改于: 2023-12-03 15:27:42.361000             🧑  作者: Mango
在 ASP.NET Core 项目中,使用 Entity Framework Core 时,我们通常需要手动添加 DbContext 类并配置其连接字符串和实体集合,这对于大型项目来说非常繁琐。ASP.NET Core 框架提供了一种脚手架工具,称为 Scaffold-DbContext,用于生成DbContext类和实体类型的代码。
Scaffold-DbContext 是 Entity Framework Core 中的一个命令行工具,它使用已经存在的数据库架构来手动创建 EF Core 模型(DbContext、实体类等)的脚手架代码。
其语法格式为:
Scaffold-DbContext "连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
其中,“连接字符串”是指向您的数据库的有效连接字符串,“Microsoft.EntityFrameworkCore.SqlServer” 是数据库提供程序名称,-OutputDir 是生成代码的目的地。
首先,您需要在 Visual Studio 菜单中选择“工具”>“NuGet 包管理器”>“程序包管理器控制台”打开控制台:
接下来,您需要安装 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 命令生成的代码包含一个 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 工具都可以大大提高您的工作效率。