Entity Framework Core를 사용하여 MySQL에 액세스하기 위한 준비(데이터베이스 우선)
동작 확인 환경
- 비주얼 스튜디오
-
- 비주얼 스튜디오 2022
- .그물
-
- .NET 8
- Entity Framework 코어
-
- Entity Framework 코어 8.0
- MySQL
-
- MySQL 8.4
- Pomelo.EntityFrameworkCore.MySql
-
- 8.0.2
※상기는 검증 환경이지만, 다른 버전에서도 동작할 수 있습니다.
처음에
Entity Framework Core는 데이터베이스에 액세스할 때 SQL 문을 직접 작성하지 않고도 코드 정의 모델(클래스)을 통해 데이터베이스 레코드에 액세스할 수 있는 O/R 매퍼 라이브러리입니다. 이렇게 하면 다음과 같은 이점이 있습니다.
- SQL 문을 직접 작성하지 않아 SQL 주입과 같은 보안 위험을 줄입니다.
- SQL문은 문자열이기 때문에 구문을 잘못하더라도 빌드 오류 검사 대상이 아니지만, 모델이 프로그램 구문이기 때문에 빌드 시 오류 여부를 확인할 수 있습니다.
Entity Framework Core는 기존 데이터베이스에서 이러한 모델 및 데이터베이스에 연결하는 코드를 자동으로 생성합니다. 반대로 코드를 수동으로 작성한 다음 데이터베이스를 자동으로 생성하는 방법이 있습니다.
전자를 "데이터베이스 우선"이라고 하고 후자를 "코드 우선"이라고 합니다. ER 다이어그램과 같은 청사진에서 코드와 데이터베이스를 생성하는 "모델 우선"도 있지만 Entity Framework Core에서는 널리 사용되지 않습니다.
이번에는 데이터베이스가 이미 존재한다는 가정 하에 코드를 생성하는 "데이터베이스 우선" 패턴을 사용합니다.
MySQL 설정
이 팁에서는 MySQL 데이터베이스에 액세스하기 위해 MySQL을 미리 설정했는지 확인하세요. 개발 환경의 PC 또는 네트워크를 통해 다른 PC에 설정할 수 있습니다. 개발 환경에서 MySQL에 연결할 수 있다면 사용할 수 있습니다. 이 팁에서는 다른 환경에 MySQL을 설치했습니다.
MySQL 설정 단계는 중복되므로 생략됩니다. 다음 페이지에는 설정 단계에 대한 MySQL 관련 팁이 포함되어 있습니다.
테이블 만들기
이 경우 샘플로 다음 스키마(데이터베이스)와 테이블을 만듭니다.
- 스키마 이름 : test_schema
- 테이블 이름 : user
- 테이블 열 : [id], [name], [password], [age], [email], [birthday], [is_provisional_registration], [update_datetime]
어떻게 작성하는지는 중요하지 않지만 지루하다면 MySQL에 대해 다음 SQL을 실행하고 생성하십시오.
다음은 스키마 생성 SQL입니다.
CREATE DATABASE `test_schema`;
테이블 생성은 SQL입니다.
CREATE TABLE `user` (
`id` int NOT NULL,
`name` varchar(20) NOT NULL,
`password` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(200) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`is_provisional_registration` tinyint(1) NOT NULL,
`update_datetime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='テストコメント';
SQL에 레코드를 추가합니다.
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (1, '氏名1', 'aaaa', 20, 'aaaa@example.com', '2020-04-01', 0, '2021-03-14T00:00:00.0000000');
INSERT INTO `test_schema`.`user` (`id`,`name`,`password`,`age`,`email`,`birthday`,`is_provisional_registration`,`update_datetime`) VALUES (2, '氏名2', 'bbbb', 30, 'bbbb@example.com', '2010-04-01', 1, '2021-03-14T00:00:00.0000000');
계정에 대한 권한 설정
프로그래밍한 계정이 MySQL 스키마에 액세스할 수 있도록 호스트 이름이 설정되어 있는지 확인합니다.
또한 연결하려는 계정에 액세스할 수 있는 test_schema
권한을 설정해야 합니다.
이번에는 기록을 검색하는 과정을 수행합니다 SELECT
.
이번에는 하지 않지만, 삽입이나 갱신을 하고 싶은 분 INSERT
UPDATE
은 와 를 확인해 주세요.
Visual Studio 설치
이미 설정했다고 가정합니다. 설정 절차를 알고 싶은 분은 다음 페이지에 정리했습니다.
프로젝트 만들기
Entity Framework Core는 특정 실행 환경에 종속되지 않으므로 많은 프로젝트에서 사용할 수 있습니다. 이 경우 간단한 콘솔 애플리케이션 환경에서 Entity Framework Core를 사용합니다.
새 프로젝트에서 콘솔 앱(.NET Framework가 아닌 것)을 선택합니다.
프로젝트를 생성했습니다. 프로젝트 이름은 무엇이든 될 수 있습니다.
MySQL용 Entity Framework Core 패키지 가져오기
NuGet과 함께 Entity Framework Core를 사용하기 위한 패키지를 가져옵니다. 패키지는 다음을 사용합니다. 이것은 Microsoft의 공식은 아니지만 널리 사용됩니다.
- Pomelo.EntityFrameworkCore.MySql
종속성을 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다.
탭에서 "찾아보기"를 선택한 상태에서 검색 필드 Pomelo
에 입력합니다. 관련 패키지 목록이 표시됩니다.
여기에서 다음 패키지를 설치합니다.
- Pomelo.EntityFrameworkCore.MySql
설치하려는 항목을 선택하고 설치 버튼을 클릭합니다. 버전에 대해 안정적인 최신 버전을 선택합니다.
대화는 기본적으로 괜찮고 괜찮습니다.
패키지는 다음과 같다고 생각합니다.
그런 다음 검색 필드에 입력 EntityFrameworkCore
하고 다음도 설치합니다.
- Microsoft.EntityFrameworkCore.Tools
버전의 Pomelo.EntityFrameworkCore.MySql
경우 에서 참조하는 Microsoft.EntityFrameworkCore
버전과 일치합니다.
이번에는 8.0.2를 언급하고 있으니 Microsoft.EntityFrameworkCore.Tools
그것도 8.0.2로 합시다.
이 패키지는 데이터베이스에서 코드를 생성하는 데 사용됩니다.
결국 다음과 같아야 합니다.
데이터베이스 테이블 구성에서 모델(코드) 만들기
모델 및 기타 코드를 자동으로 생성하려면 먼저 프로젝트를 빌드하여 오류가 없는지 확인해야 합니다. 오류가 있으면 모델이 실패합니다. 오류가 없음을 이미 확인했다면 빌드할 필요가 없습니다.
Visual Studio에서 패키지 관리자 콘솔을 엽니다. 그렇지 않은 경우 도구, NuGet 패키지 관리자 및 패키지 관리자 콘솔 메뉴에서 열 수 있습니다.
아래와 같은 창이 표시되므로 오른쪽 상단의 "기본 프로젝트"가 모델을 생성하려는 프로젝트인지 확인하십시오. (여러 프로젝트가 있는 경우 주의가 필요합니다)
입력 필드에 다음 텍스트를 입력합니다. 환경에 따라 파라미터가 변경되므로 다음 설명을 바탕으로 적시에 변경해 주세요.
Scaffold-DbContext "Server=<サーバー名>; Database=<スキーマ名>; user=<接続ユーザー名>;password=<接続パスワード>;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
입력 예
Scaffold-DbContext "Server=TestServer; Database=test_schema; user=test_user;password=XXXXXXXX;" Pomelo.EntityFrameworkCore.MySql -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
파라미터 | 설명 | 파라미터 예제 |
---|---|---|
공급자 | MySQL이 Pomelo.EntityFrameworkCore.MySql 라면 다음과 같이 지정합니다. |
Pomelo.EntityFrameworkCore.MySql |
연결 | 데이터베이스에 연결하기 위한 연결 문자열입니다. 연결 문자열은 다른 앱에서도 사용할 수 있으므로 연결 문자열의 표기에 따라 지정된 내용을 작성하십시오. 덧붙여서, 모델을 만드는 데만 일시적으로 사용되기 때문에 이 연결 문자열에 대해 앱을 게시한 후 보안에 대해 인식할 필요가 없습니다. 비밀번호에 기호가 있는 경우 이스케이프에 주의하세요. | "서버=테스트서버; 데이터베이스=test_schema; 사용자=테스트 사용자; 비밀번호=XXXXXXXX;" |
f | 이미 프로그램이 있는 경우에도 강제 덮어씁니다. | <> 없음 |
출력 디렉토리 | 코드를 출력할 폴더 경로입니다. 프로젝트 폴더의 상대 경로 | 모델\데이터베이스 |
문맥 | Entity Framework를 사용할 때의 컨텍스트 클래스 이름 | 테스트데이터베이스 Db컨텍스트 |
데이터베이스 이름 사용 | 지정하면 데이터베이스의 테이블 이름은 그대로 클래스 이름이 됩니다. 그렇지 않은 경우 엔터티 클래스 이름의 대소문자는 규칙에 따라 조정됩니다. | <> 없음 |
Data주석 | 지정된 경우 열 형식은 각 속성에 DataAnnotation 특성을 자동으로 추가합니다. 데이터베이스의 유형에 따라 자동으로 입력 검사를 수행하려는 경우 약간 유용합니다. | <> 없음 |
Namespace | 생성된 엔터티 클래스가 속한 네임스페이스입니다. 지정하지 않으면 네임스페이스는 폴더에 따라 결정됩니다. | 테스트네임스페이스 |
Context네임스페이스 | 생성된 컨텍스트가 속한 네임스페이스입니다. 지정하지 않으면 네임스페이스는 폴더에 따라 결정됩니다. | 테스트네임스페이스 |
NoOn구성 | 코드에 원시 연결 문자열을 포함하지 마세요. | <> 없음 |
복수화 금지 | Context에서 각 테이블 이름의 복수형 속성 이름을 사용하지 마십시오. | <> 없음 |
Enter 키를 눌러 실행하고 코드를 자동 생성합니다. 오류인 경우 이유가 표시되므로 오류의 내용에 따라 대응하십시오.
user
테이블의 모델 코드는 다음과 같습니다.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SetupMysqlDatabaseFirst.Models.Database;
<summary>
テストコメント
</summary>
public partial class user
{
[Key]
public int id { get; set; }
[StringLength(20)]
public string name { get; set; } = null!;
[StringLength(20)]
public string? password { get; set; }
public int? age { get; set; }
[StringLength(200)]
public string? email { get; set; }
public DateOnly? birthday { get; set; }
public bool is_provisional_registration { get; set; }
[Column(TypeName = "datetime")]
public DateTime? update_datetime { get; set; }
}
덧붙여서, 경고는 생성 된 컨텍스트 클래스의 코드에 연결 문자열이 그대로 작성되기 때문에 표시됩니다. 가능하면 연결 문자열은 별도의 장소에 저장하고 런타임에 설정해야 합니다만, 이번에는 동작 확인을 위한 목적이므로 그대로 둡니다.
기록을 가져와 보기
이제 데이터베이스의 레코드에 액세스하는 코드가 있으므로 레코드를 가져와 콘솔에 표시해 보겠습니다.
Program.cs
다음과 같이 수정합니다.
using SetupMysqlDatabaseFirst.Models.Database;
using System.Text.Json;
Console.WriteLine("Hello, World!");
// データベースコンテキストのインスタンスを生成する
using var dbContext = new TestDatabaseDbContext();
// データベースから User 一覧を取得する
var users = dbContext.user.ToList();
// 取得した User 情報をコンソールに書き出す
foreach (var user in users)
{
Console.WriteLine(JsonSerializer.Serialize(user));
}
를 사용하여 자동 생성된 클래스 new
를 DbContext
생성합니다. 데이터베이스 연결이 자동으로 삭제될 수 있도록 using var
선언됩니다.
dbContext
각 모델에 액세스하기 위한 속성을 생성했으므로 이번에는 user
속성에 액세스하여 User
테이블의 레코드를 조작할 수 있습니다.
내부적으로 자동으로 생성되므로 발행되는 SQL을 알 필요가 없습니다.
ToList
여기서는 확장 메서드를 사용하여 user
테이블의 모든 레코드를 가져옵니다.
foreach
그런 다음 및 JsonSerializer.Serialize
메서드를 사용하여 user
콘솔에 정보를 표시합니다.
위에서 언급했듯 user
이 테이블의 각 열은 속성으로 선언되므로 값을 개별적으로 검색하는 것도 가능합니다.