在Entity Framework Core中为现有数据库创建模型

在这里,您将学习如何在Entity Framework Core中为现有数据库创建上下文和实体类。为现有数据库创建实体和上下文类称为Database-First方法。
EF Core不支持用于可视化设计器的DB模型和向导来创建类似于EF 6的实体和上下文类。因此,我们需要使用Scaffold-DbContext命令进行逆向工程。此逆向工程命令基于现有数据库的架构创建实体和上下文类(通过派生DbContext)。
让我们在下面显示的本地MS SQL Server中为以下SchoolDB数据库创建实体和上下文类。

Scaffold-DbContext命令

使用Scaffold-DbContext基于现有数据库创建模型。可以在Package Manager控制台中的Scaffold-DbContext中指定以下参数:

Scaffold-DbContext [-Connection] [-Provider] [-OutputDir] [-Context] [-Schemas>] [-Tables>] [-DataAnnotations] [-Force] [-Project] [-StartupProject] [<CommonParameters>]

在Visual Studio中,选择菜单工具-> NuGet软件包管理器->软件包管理器控制台,然后运行以下命令:

Scaffold-DbContext "Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

在上面的命令中,第一个参数是一个连接字符串,它包括三个部分:
数据库服务器, 数据库名称和安全信息。在这里,Server=.\SQLExpress;指本地SQLEXPRESS数据库服务器。
Database=SchoolDB; 指定我们要为其创建类的数据库名称“ SchoolDB”。 Trusted_Connection=True; 指定Windows身份验证。
它将使用Windows凭据连接到SQL Server。第二个参数是提供程序名称。我们将提供程序用于SQL Server,因此它是Microsoft.EntityFrameworkCore.SqlServer。 -OutputDir参数指定我们要在其中生成所有类的目录,在本例中为Models文件夹。
使用以下命令可获得有关Scaffold-DbContext命令的详细帮助:

get-help scaffold-dbcontext –detailed

上面的Scaffold-DbContext命令使用为Models文件夹中所有实体的Fluent API配置为SchoolDB数据库中的每个表创建实体类,并通过派生DbContext创建数据库上下文类。
以下是为Student表生成的Student实体类。:

using System;
using System.Collections.Generic;namespace EFCoreTutorials.Models
{public partial class Student{public Student(){StudentCourse = new HashSet<StudentCourse>();}public int StudentId { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public int? StandardId { get; set; }public Standard Standard { get; set; }public StudentAddress StudentAddress { get; set; }public ICollection<StudentCourse> StudentCourse { get; set; }}
}

以下是SchoolDBContext类,可用于保存或检索数据:

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;namespace EFCoreTutorials.Models
{public partial class SchoolDBContext : DbContext{public virtual DbSet<Course> Course { get; set; }public virtual DbSet<Standard> Standard { get; set; }public virtual DbSet<Student> Student { get; set; }public virtual DbSet<StudentAddress> StudentAddress { get; set; }public virtual DbSet<StudentCourse> StudentCourse { get; set; }public virtual DbSet<Teacher> Teacher { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){if (!optionsBuilder.IsConfigured){
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.optionsBuilder.UseSqlServer(@"Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;");}}protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Course>(entity =>{entity.Property(e => e.CourseName).HasMaxLength(50).IsUnicode(false);entity.HasOne(d => d.Teacher).WithMany(p => p.Course).HasForeignKey(d => d.TeacherId).OnDelete(DeleteBehavior.Cascade).HasConstraintName("FK_Course_Teacher");});modelBuilder.Entity<Standard>(entity =>{entity.Property(e => e.Description).HasMaxLength(50).IsUnicode(false);entity.Property(e => e.StandardName).HasMaxLength(50).IsUnicode(false);});modelBuilder.Entity<Student>(entity =>{entity.Property(e => e.StudentId).HasColumnName("StudentID");entity.Property(e => e.FirstName).HasMaxLength(50).IsUnicode(false);entity.Property(e => e.LastName).HasMaxLength(50).IsUnicode(false);entity.HasOne(d => d.Standard).WithMany(p => p.Student).HasForeignKey(d => d.StandardId).OnDelete(DeleteBehavior.Cascade).HasConstraintName("FK_Student_Standard");});modelBuilder.Entity<StudentAddress>(entity =>{entity.HasKey(e => e.StudentId);entity.Property(e => e.StudentId).HasColumnName("StudentID").ValueGeneratedNever();entity.Property(e => e.Address1).IsRequired().HasMaxLength(50).IsUnicode(false);entity.Property(e => e.Address2).HasMaxLength(50).IsUnicode(false);entity.Property(e => e.City).IsRequired().HasMaxLength(50).IsUnicode(false);entity.Property(e => e.State).IsRequired().HasMaxLength(50).IsUnicode(false);entity.HasOne(d => d.Student).WithOne(p => p.StudentAddress).HasForeignKey<StudentAddress>(d => d.StudentId).HasConstraintName("FK_StudentAddress_Student");});modelBuilder.Entity<StudentCourse>(entity =>{entity.HasKey(e => new { e.StudentId, e.CourseId });entity.HasOne(d => d.Course).WithMany(p => p.StudentCourse).HasForeignKey(d => d.CourseId).OnDelete(DeleteBehavior.ClientSetNull).HasConstraintName("FK_StudentCourse_Course");entity.HasOne(d => d.Student).WithMany(p => p.StudentCourse).HasForeignKey(d => d.StudentId).HasConstraintName("FK_StudentCourse_Student");});modelBuilder.Entity<Teacher>(entity =>{entity.Property(e => e.StandardId).HasDefaultValueSql("((0))");entity.Property(e => e.TeacherName).HasMaxLength(50).IsUnicode(false);entity.HasOne(d => d.Standard).WithMany(p => p.Teacher).HasForeignKey(d => d.StandardId).OnDelete(DeleteBehavior.Cascade).HasConstraintName("FK_Teacher_Standard");});}}
}

注意:EF Core仅为表创建实体类,而不为StoredProcedures或View创建实体类。

使用DotNet CLI

如果使用dotnet命令行界面执行EF Core命令,则打开命令提示符并导航到根文件夹,然后执行以下dotnet ef dbcontext scaffold命令:

通过本文学习,您可以使用EF Core为现有数据库创建EF Core模型。
注意:创建模型后,无论何时更改模型,都必须使用“迁移”命令,以使数据库与模型保持最新。

Entity Framework Core系列教程-3为现有数据库生成实体模型相关推荐

  1. Entity Framework Core系列教程-25-Entity Framework Core日志

    Entity Framework Core日志 我们经常需要在EF Core中记录SQL并更改跟踪信息以进行调试. EF Core日志记录自动与.NET Core的日志记录机制集成.因此,在隐含使用E ...

  2. Entity Framework Core系列教程-23-原生SQL查询

    在Entity Framework Core中执行原生SQL查询 Entity Framework Core提供了DbSet.FromSql()方法来对基础数据库执行原始SQL查询,并将结果作为实体对 ...

  3. 在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句

    在开发中,我们想在调试中查看EF Core执行的sql语句,可以使用SQL Studio Manager Tools工具,另一种方式是使用EF Core提供的日志.在ASP.NET Core使用Ent ...

  4. 使用Entity Framework Core,Swagger和Postman创建ASP.NET Core Web API的分步指南

    目录 介绍 背景 第1步:创建一个新项目 第2步:添加模型类 第3步:使用Entity Framework Core 第4步:添加数据库上下文和控制器 步骤5:在Package Manager控制台中 ...

  5. Entity Framework Core 生成跟踪列

    注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布时,功能可能存在变动. 当您设计数据库时,有时需要添加列以跟踪记录何时更改 ...

  6. 手把手引进门之 ASP.NET Core Entity Framework Core(官方教程翻译版 版本3.2.5)

    以下是手把手引进门教程,基于 ASP.NET Core, Entity Framework Core ,ABP 框架 创建Web 应用, PS: 自带自动的测试模块哦. 样例下载 (上 github  ...

  7. ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门

    ASP.NET Core 入门教程 8.ASP.NET Core + Entity Framework Core 数据访问入门 原文:ASP.NET Core 入门教程 8.ASP.NET Core ...

  8. ASP.NET Core 和 EF Core系列教程——CRUD

    ASP.NET Core 和 EF Core系列教程--CRUD (2 / 10) CRUD 为创建.读取.更新.删除的英文首字母的缩写 作者:Tom Dykstra和Rick Anderson Co ...

  9. Entity Framework Core介绍(1)

    介绍 Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术. EF Core 可用作对象关系映射程序 (O/RM),以 ...

最新文章

  1. 兰大计算机学院保研,兰州大学的保研情况怎么样?保研率高吗?
  2. 2009.09.01 博客近期改进公告!
  3. canvas 红包雨_天猫双十一怎么买省钱?京东双十一红包口令淘宝双十一活动攻略...
  4. 经验:tensorflow 的 GPU 配置
  5. XXXfragment that is not a fragment错误,fragment认不出来
  6. 游戏音效只是简单的改原素材吗?
  7. VB.NET2010 编程实现Word双面打印
  8. C++ 资源大全中文版
  9. SPSS回归分析案例
  10. 大模型多模态Chatgpt+自动驾驶控制器设计方案
  11. Linux中磁盘分区清理方法
  12. 用Hostwinds快速搭建Wordpress网站教程
  13. 无线电能传输LCL-S拓扑/WPT MATLAB/simulink仿真模型 (模型左边为两电平H桥逆变器,LCL-S串联谐振,右边不可控整流结构)
  14. 值传递,还是引用传递(实践是检验真理的唯一标准)
  15. 大众点评网的网站架构
  16. 在beeline中执行Linux命令,python - 从python脚本执行beeline命令时出现“找不到beeline命令”错误(从oozie shell操作调用) - 堆栈内存溢出...
  17. C++3.4数据结构之队列基础+blah数集题解
  18. 计算机本地管理员账户密码,请问下忘记了 2008R2本地管理员账户密码怎么办?...
  19. 前端判断扫码的客户端是微信还是支付宝?
  20. cuda10.1的一步步详细安装记录

热门文章

  1. 【blackduck】 Request failed authorization [HTTP Error]: XXX, response was 403 Forbidden.
  2. 如何用turtle画椭圆?
  3. android蓝牙门禁,1号社区APP互联门禁产品新开门方式说明
  4. 《算法新解》作者刘新宇:我只是想打开那些黑盒子,告诉人们里面有什么。
  5. 无需Avatarify 无需剪辑工具 一键生成多人版 “蚂蚁呀嘿“视频
  6. c语言泰勒公式求ln,ln(1-x)的泰勒级数展开是什么?
  7. DOOM之父约翰·卡马克
  8. python递归,匿名函数
  9. 企业软文推广应该怎么做,软文写作指导
  10. 【原】在vc中实现获取汉字拼音的首字母 - lixiaosan的专栏 - CSDNBlog