前文中已经介绍了EF Core CLI,本篇文章继续进行实际的CLI的应用
基于上篇文章中的项目继续进行演示
如何将数据库中的表生成我们想要的模型
第一步:创建数据库,这里我采用的是sqlserver数据库
我们创建一个名为school的数据库
然后添加教师表-teacher
下一步我们找到我们项目工程文件夹,通过命令切换到指定的文件夹
执行命令
dotnet ef dbcontext scaffold "Server=127.0.0.1;Database=School;Trusted_Connection=True;User id=sa; Password=*******;" Microsoft.EntityFrameworkCore.SqlServer
但是结果总是这么不顺利,出现了错误
分析了一下错误原因,原来是咱们的项目中没有引用Microsoft.EntityFrameworkCore.Design的包导致的
我们引用一下看看
然后我们再次尝试运行命令
依然报错,这是什么原因呢?
我们尝试一下先保存文件看看,是不是由于没有保存项目工程文件导致的呢,毕竟如果引用了nuget包项目工程文件就发生了变化
再次尝试运行命令
OK,搞定了,我们看一下生成的文件
我们的解决方案中多出了两个文件,一个是数据的上下文类,一个是我们的模型类
我们来看一下代码
Teacher类
public partial class Teacher { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public DateTime InductionTime { get; set; } public DateTime CreateTime { get; set; } public bool IsDetele { get; set; } }
SchoolContext类
public partial class SchoolContext : DbContext { public SchoolContext() { } public SchoolContext(DbContextOptions<SchoolContext> options) : base(options) { } public virtual DbSet<Teacher> Teachers { 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. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263. optionsBuilder.UseSqlServer("Server=127.0.0.1;Database=School;Trusted_Connection=True;User id=sa; Password=******;"); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasAnnotation("Relational:Collation", "Chinese_PRC_CI_AS"); modelBuilder.Entity<Teacher>(entity => { entity.ToTable("Teacher"); entity.Property(e => e.Age).HasComment("年龄"); entity.Property(e => e.CreateTime) .HasColumnType("datetime") .HasComment("创建时间"); entity.Property(e => e.InductionTime) .HasColumnType("datetime") .HasComment("入职时间"); entity.Property(e => e.IsDetele).HasComment("是否删除"); entity.Property(e => e.Name) .IsRequired() .HasMaxLength(50) .HasComment("名称"); }); OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); }
OK 至此我们成功的基于我们的数据创建了数据库实体
但是发现特别是这个数据库上下文,我们完全弄不懂里面到底是做了什么,后面的文章中我会一点点讲解上下文这块代码
现在我们发现了一个问题,这个类文件我们都放到了项目的根目录下面,我们是不是可以对咱们生成的模型文件单独创建一个文件夹然后进行统一的管理呢?
通过查看上一篇文章中的讲解,我们发现可以使用 --output-dir <PATH>这个选项进行配置
首先我们先将已经生成的文件删除,保持一个空的项目工程
然后我们执行命令
dotnet ef dbcontext scaffold "Server=127.0.0.1;Database=School;Trusted_Connection=True;User id=sa; Password=******;" Microsoft.EntityFrameworkCore.SqlServer -o Models
ok,执行成功
我们看一下结果
发现我们的项目工程中多了个文件夹,并且我们生成的文件都放入了这个文件夹中
生成的类文件的命名空间也发生了变化,是不是很神奇,CLI不光给我们创建了文件夹,还将文件夹放入到我们的项目工程文件中而且生成的文件的命名空间都给进行了改变
其他的选项我就不进行演示了,基本原理都是一样的,各位有兴趣可以自己尝试一下
现在我们做个总结 通过本文我们了解到EF core是如何通过CLI工具将数据库中的表创建成我们想要的实体并我们可以指定文件夹来保存生成的文件