contract@chaoreumsoft.co.kr |    031-921-0523

Entity Framework Core 데이터베이스 생성

페이지 정보

작성자최고관리자

본문

Entity Framework Core에서 기존 데이터베이스에 대한 모델 만들기 


Entity Framework Core에서 기존 데이터베이스에 대한 컨텍스트 및 엔터티 클래스를 만드는 방법을 배웁니다.


기존 데이터베이스에 대한 엔터티 및 컨텍스트 클래스를 생성하는 것을 데이터베이스 우선 접근 방식이라고 합니다.


EF Core는 EF 6과 유사한 엔터티 및 컨텍스트 클래스를 생성하기 위한 DB 모델 및 마법사용 비주얼 디자이너를 지원하지 않습니다.


따라서 Scaffold-DbContext 명령을 사용 하여 리버스 엔지니어링을 수행 해야 합니다.


이 명령은 기존 데이터베이스의 스키마를 기반으로 엔터티 및 컨텍스트 클래스(DbContext 파생)를 만듭니다.


아래 표시된 로컬 MS SQL Server에서 다음 SchoolDB 데이터베이스에 대한 엔터티 및 컨텍스트 클래스를 생성해 보겠습니다.


0dc9464e270a7c53b10f992ce51c360e_1651214001_7879.png
 

Scaffold-DbContext Command

Scaffold-DbContext를 사용하여 기존 데이터베이스를 기반으로 모델을 만듭니다. 패키지 관리자 콘솔에서 Scaffold-DbContext를 사용하여 다음 매개변수를 지정할 수 있습니다.

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

Visual Studio에서 메뉴 도구 -> NuGet 패키지 관리자 -> 패키지 관리자 콘솔을 선택하고 다음 명령을 실행합니다.

PM> Scaffold-DbContext "Server=.\SQLExpress;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
위 명령에서 첫 번째 매개변수는 DB 서버, 데이터베이스 이름 및 보안 정보의 세 부분을 포함하는 연결 문자열입니다. 

여기, Server=.\SQLExpress; 로컬 SQLEXPRESS 데이터베이스 서버를 나타냅니다. 

Database=SchoolDB; 클래스를 생성할 데이터베이스 이름 "SchoolDB"를 지정합니다.


Trusted_Connection=True; Windows 인증을 지정합니다. Windows 자격 증명을 사용하여 SQL Server에 연결합니다.


두 번째 매개변수는 공급자 이름입니다.


우리는 SQL Server용 공급자를 사용하므로 Microsoft.EntityFrameworkCore.SqlServer입니다.


-OutputDir 매개변수는 이 경우 Models 폴더인 모든 클래스를 생성하려는 디렉토리를 지정합니다.


Scaffold-DbContext 명령에 대한 자세한 도움말을 보려면 다음 명령을 사용하십시오.

PM> get-help scaffold-dbcontext –detailed

위의 Scaffold-DbContext 명령은 Models폴더의 모든 엔터티에 대한 Fluent API 구성을 사용하여 SchoolDB 데이터베이스 및 컨텍스트 클래스(DbContext 파생)의 각 테이블에 대한 엔터티 클래스를 만듭니다.


0dc9464e270a7c53b10f992ce51c360e_1651214343_6743.png
 

다음은 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 또는 Views가 아닌 테이블에 대해서만 엔터티 클래스를 만듭니다.

DotNet CLI 

dotnet 명령줄 인터페이스를 사용하여 EF Core 명령을 실행하는 경우 명령 프롬프트를 열고 루트 폴더로 이동하여 다음 dotnet ef dbcontext scaffold 명령을 실행합니다.


> dotnet ef dbcontext scaffold "Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models 
따라서 기존 데이터베이스에 대한 EF Core 모델을 만들 수 있습니다. 

참고: 모델을 만든 후에는 모델을 변경할 때마다 마이그레이션 명령을 사용하여 데이터베이스를 모델과 함께 최신 상태로 유지해야 합니다.


Tag
Entity Framework Core 사용법, EF Core
© Chaoreumsoft Corp. All rights reserved.