본문 바로가기

c#

ASP.Net Core MVC Entity Frame work 사용하기 -1

Entity FrameWork 는 Microsoft 에서 제공하는 ORM 프레임 워크 입니다.

ORM을 사용하면 따로 Ado.Net 처럼 쿼리를 작성 하지 않아도 데이터를 처리 할 수 있습니다.

따라서 개발자가 쿼리작성보다 개발에 더 집중 할 수 있습니다.

다만 속도가 느리고 마이그레이션이 잘 안되는 경우가 있습니다.

 

entity framework 의 접근방법 구분

entity framework에서 의 접근방법은 3가지로 구분 되어 있는데 DB Frist, Code First, Model First가 있습니다.

DB First 는 db를 먼제 생성하고 접근하는 방법이며

Code First는 코드에서 모델을 먼저 작성해서 접근하는 방법

Model Frist는 Visual Studio에서의 Entity DataModel을 사용하여 접근하는 방법 입니다.

 

제가 해볼 프로젝트에서는 Code Frist를  채택해여 사용하겠습니다. 

 

개발환경

DB MsSQL
IDE Visual Studio 2022
Frame work .Net7 , ASP.Net CORE MVC ,Entity Frame WorkCore ,
Entity Framework.Core.SqlServer, Entity FrameworkCore.Tools

 

테이블 스키마

1. Model 생성

-Model Package를 생성한 뒤 아래와 같이 작성합니다. 

 기본적으로 프로퍼티의 이름은 DB의 컬럼명으로 똑같이 입력되며 프로퍼티의 위에 Attribute를 사용하여 db컬럼에 대한 데이터 속성 등을 지정 할 수 있습니다. 

 

entity Frame work 애트리뷰트 

[Key] 해당 컬럼 값을 Pk로 지정할 때 사용
[Required] 해당 컬럼 값에 null값이 들어올수 없음
[Foreignkey] 외래키로 지정할 때 사용

 

 

namespace School.Models
{
    /// <summary>
    /// 학생 entity
    /// </summary>
    public class Student
    {
        [Key]
        public string StudentId { get; set; }

        [Required]
        public string StudentName { get; set; }

        [Required]
        public int StudentAge { get; set; }

        [Required]
        public int StudentClass { get; set; }

        public virtual ICollection<Score> Scores { get; set; }
    }
}

 

namespace School.Models
{
    /// <summary>
    /// 과목 entity
    /// </summary>
    public class Category
    {
        [Key]
        public string Categoryid { get; set; }

        [Required]
        public string CategoryName { get; set; }

        public virtual ICollection<Score> Scores { get; set; }

    }
}

 

namespace School.Models
{
    /// <summary>
    /// 성적 entity
    /// </summary>
    public class Score
    {
        [Key]
        public string ScoreNo { get; set; }

        [Required]
        public string StudentId { get; set; }

        [ForeignKey("StudentId")]
        public virtual Student Student { get; set; }
       
        [Required]
        public string CategoryId { get; set; }  

        [ForeignKey("CategoryId")]
        public virtual Category Category { get; set; }

        public double score { get; set; }
    }
}

 

Score는 Student와 Categroy를 참조하여 가지고 있으며 이때 virtual을 사용하여 지연로딩을 시키고

해당 모델클래스를 선언해서 관계를 성립합니다.

마찬가지로 참조 당하는 쪽은 ICollection을 사용하여 참조 하려는 클래스를 설정해서 매핑시킵니다.

 

2. 데이터 베이스 연동 설정 및 세팅

appsettings.json파일에 데이터베이스 접속 정보를 작성하여 넣어줍니다.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  // Local mssql연동 
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "SchoolDBContext": "Server=DESKTOP-TKOPMES\\SQLEXPRESS; Database=InBody; User Id=test; Password=test; TrustServerCertificate=True"
  }
}

 

namespace School.DataContext
{
    /// <summary>
    /// 데이터 베이스 연동 설정
    /// </summary>
    public class SchoolDBContext: DbContext
    {     
        public DbSet<Student> Students { get; set; } //학생 데이터 모델

        public DbSet<Score> Scores { get; set; }     //성적 데이터 모델

        public DbSet<Category> Categories { get; set; } //과목 데이터 모델


        public SchoolDBContext(DbContextOptions dbContextOptions ):base(dbContextOptions)   
        {

        }  
    }
}

 

DbSet을 사용하여 데이터 베이스에 생성할 entity를 지정합니다.

이때 SchoolDBContext를 통해 appsetting.jason의 설정을 읽어와 db에 연동합니다.

 

3.데이터베이스 업데이트 및 마이그레이션

아래 두개 명령어를 순서대로 쳐서 DB에 적용 시킵니다.

 

Add - migration 마이그레이션 이름 (마이그레이션 클래스 이름 지정)

update-database   (데이터베이스 업데이트 명령어)

 

마이그레이션스크립트를 실행해주면 DB에 entity에 맞는 테이블이 생성되고 migration 폴더에 새로운 지정한 이름에 맞는 클래스가 생성 될 것입니다.