Entity Framework을 통해 Model(Entity -> 이하 Model이라고 칭함)을 만들면 모델에 따라 DataBase에 Table을 생성할 수 있습니다. 그런데 키나 값의 제약조건 등 다양한 테이블의 속성을 정확하게 Model로 구현하기가 까다로울뿐더러 Table의 개수가 수십 개가 되면 그와 매핑되는 모델을 만들어 주기도 어려웠습니다.
Core이전에는 'ADO.NET Entity Data Model'을 사용했지만 Core는 아직 같은 기능으로 사용할 수 있는 건 없는 듯합니다.
따라서 차라리 직접 Database에 Query나 전용 Tool을 사용해 Table을 생성한 다음 만들어진 Table을 대상으로 Model을 가져오는 편이 나을지도 모르며. 이 글에서는 이러한 방법을 안내하고자 합니다. 참고로 여기서 소개하는 방법은 MySQL / MariaDB의 경우입니다. MS-SQL도 명령어만 조금 다를 뿐 진행방식은 동일합니다.
1. DB 생성
당연한 얘기지만 사용할 DB와 Table을 미리 만들어 둡니다. 예제에서는 school DB에 student와 group이라는 2개의 테이블을 생성하고 진행하도록 하겠습니다.
2. 프로젝트 생성
먼저 Visual Studio를 사용해 Core관련 프로젝트를 생성해야 합니다. 대개의 경우 Web API나 Web 프로젝트에서 DB 관련 클래스나 모델을 바로 추가하는 것이 아니라 별도의 프로젝트를 생성해 참조하는 방식으로 진행하는 경우가 많습니다. 굳이 이러한 방식을 해야 한다는 것은 아니지만 관리상의 이점도 생각해 봤을 때 별도의 Core Class Library프로젝트를 생성하여 진행하는 편이 좋습니다.
3. Package 설치
이게 좀 중요합니다. 우선 연결하려는 DB가 mysql/mariadb 이므로 Pomelo.EntityFrameworkCore.MySql을 nuget package에서 검색해 내려받습니다. 글을 쓰는 날짜 기준으로 최신 버전은 3.2.4입니다.
그리고 Model을 생성하기 위해 필요한 Microsoft.EntityFrameworkCore.Relational과 Microsoft.EntityFrameworkCore.Design package도 내려받습니다. 다만 최신 버전을 무턱대로 설치해서는 안됩니다. 의존성이 문제가 되는데 3.2.4 버전의 Pomelo.EntityFrameworkCore.MySql 에서는 3.1.13 버전까지의 Microsoft.EntityFrameworkCore.Relational과 Microsoft.EntityFrameworkCore.Design package만을 지원합니다. 그 이상 버전을 설치해도 Model을 생성하는 데는 문제가 없지만 정작 프로그램이 실행되지는 않으니 의미가 없습니다. 그러므로 버전을 맞춰줘야 합니다.
참고로 Relational과 Design의 2021년 03월 최신 버전은 5.0.4인데 아무래도 .NET 5버전에 맞춰서 나온 것으로 판단됩니다. 현재 이 글에서 진행하고자 하는 버전은. NET Core 3.x 버전이며 .NET 5는 장기지원 버전이 아니므로 .NET 5를 통해 프로젝트를 진행하는 건 권장하지 않습니다.
4. dotnet 설치 및 실행
다음 명령을 사용해 dotnet을 설치합니다.
dotnet tool install --global dotnet-ef |
그다음 1번에서 생성한 프로젝트 폴더로 이동합니다. 폴더는 csproj파일이 존재하는 위치여야 합니다. 해당 위치로 이동했으면 DB로의 연결 문자열을 지정해 DB로부터 Model을 생성하도록 합니다.
dotnet ef dbcontext scaffold "Server=localhost;user id=root;password=12345;Database=school;" Pomelo.EntityFrameworkCore.MySql -o DB |
연결 문자열에서 서버의 IP, 접속 계정, 접속할 DB 등을 지정합니다. 또한 mysql/mariadb의 경우 Pomelo.EntityFrameworkCore.MySql로 공급자를 지정해야 하는데 다른 DB의 경우 아래 글을 참고해 그에 맞는 공급자 Package를 설치하고 사용하면 됩니다.
마지막 -o 옵션에 지정한 DB는 Model을 생성할 폴더명입니다. 다른 폴더에 Model을 생성하고자 한다면 해당 폴더명을 지정해 줍니다.
데이터베이스 공급자 - EF Core | Microsoft Docs
5. 설정 및 마무리
정상적으로 진행되었다면 지정한 폴더에 schoolContext와 Table에 따른 Student.cs, Group.cs 2개의 Model 클래스 파일이 생성될 것입니다. 다만 위에서 말씀드린 것처럼 프로젝트를 DB용으로 따로 분리한 상태이기 때문에 몇 가지 수정을 거쳐야 합니다.
우선 프로젝트에 Microsoft.Extensions.Configuration과 Microsoft.Extensions.Configuration.Json Package를 설치합니다. 버전은 그냥 최신 버전을 설치하면 됩니다. 그런 뒤 schoolContext 클래스 안에 아래 설정 관련 속성을 추가하고
static public IConfigurationRoot Configuration { get; set; } |
OnConfiguring 메서드에서 DB와의 연결 부분을 Configuration.GetConnectionString("MariaDbConnectionString")으로 대체합니다.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
Configuration = builder.Build();
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.UseMySql(Configuration.GetConnectionString("MariaDbConnectionString"), x => x.ServerVersion("10.5.9-mariadb"));
}
}
그리고 해당 DB 프로젝트를 참조하고 사용할 다른 프로젝트에 있는 appsettings.json 파일에 아래와 같이 MariaDbConnectionString속성을 추가합니다.
"AllowedHosts": "*",
"ConnectionStrings": {
"MariaDbConnectionString": "Server=localhost;user id=root;password=12345;Database=school"
}
이렇게 하면 위에서 설정한 문자열을 통해 DB에 연결하게 됩니다.
6. 결론
돈 주고 살 수 있으면 그냥 MS-SQL을 사용하는 편이 나을 듯합니다. MySQL은... 개뿔... 엔진이 나쁘다는 게 아니라 공식적으로 지원하는 거도 아니고 Microsoft 개발 제품군과는 그리 잘 맞지 않는 것 같습니다.
됐고! 그냥 EF Core Power Tool을 사용하세요!
'.NET > ASP.NET' 카테고리의 다른 글
[ASP.NET Core Web API] 파일업로드(FileUpload) (0) | 2021.03.23 |
---|---|
[ASP.NET Core Web API] DI (Dependency Injection) 구현 (Autofac) (0) | 2021.03.23 |
[ASP.NET Core Web API] JWT 인증 (6) | 2021.03.23 |
[ASP.NET Core] 리눅스(CentOS 7) 설치및 구동 (0) | 2020.11.17 |
Request.Url 정리 (0) | 2019.10.02 |