Entity Framework Core with Existing Database
数据库长这样:
Scaffold-DbContext Command
说明
Use Scaffold-DbContext
to create a model based on your existing database.
The following parameters can be specified with Scaffold-DbContext in Package Manager Console:
Scaffold-DbContext [-Connection] [-Provider] [-OutputDir] [-Context] [-Schemas>] [-Tables>] [-DataAnnotations] [-Force] [-Project] [-StartupProject] [<CommonParameters>]
In Visual Studio, select menu Tools -> NuGet Package Manger -> Package Manger Console and run the following command:
Scaffold-DbContext
PM> Scaffold-DbContext "Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
参数说明:
In the above command, the first parameter is a connection string which includes three parts: DB Server, database name and security info. Here, Server=.\SQLExpress;
refers to local SQLEXPRESS database server. Database=SchoolDB;
specifies the database name "SchoolDB" for which we are going to create classes. Trusted_Connection=True;
specifies the Windows authentication. It will use Windows credentials to connect to the SQL Server.
The second parameter is the provider name. We use provider for the SQL Server, so it is Microsoft.EntityFrameworkCore.SqlServer
.
The -OutputDir
parameter specifies the directory where we want to generate all the classes which is the Models folder in this case.
Use the following command to get the detailed help on Scaffold-DbContext
command:
PM> get-help scaffold-dbcontext --detailed
生成的entity和数据库上下文
The above Scaffold-DbContext
command creates entity classes for each table in the SchoolDB
database and context class (by deriving DbContext
) with Fluent API configurations for all the entities in the Models folder.
The following is the generated Student
entity class for the Student
table.
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; } } }
The following is the SchoolDBContext
class which you can use to save or retrieve data.
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"); }); } } }
DotNet CLI
If you use dotnet command line interface to execute EF Core commands then open command prompt and navigate to the root folder and execute the following dotnet ef dbcontext scaffold
command:
dotnet ef dbcontext scaffold "Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
Thus, you can create EF Core model for an existing database.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2022-08-21 grid 布局 css