Entity Framework Core를 사용하여 SQL Server 액세스 준비(데이터베이스 우선)
운영 환경
- 비주얼 스튜디오
-
- 비주얼 스튜디오 2022
- .그물
-
- .그물 8
- Entity Framework Core
-
- Entity Framework 코어 8.0
- SQL 서버
-
- SQL 서버 2022
* 위의 내용은 검증 환경이지만 다른 버전에서도 작동할 수 있습니다.
처음에
Entity Framework Core는 O/R 매퍼 라이브러리입니다. 데이터베이스에 액세스할 때 SQL 문을 직접 사용하지 않고 코드에 정의된 모델(클래스)을 통해 데이터베이스의 레코드에 액세스할 수 있습니다. 이렇게 하면 다음과 같은 이점이 있습니다.
- SQL문이 직접 작성되지 않기 때문에 SQL 인젝션과 같은 보안 위험이 줄어듭니다.
- SQL문은 문자열이기 때문에 구문에 실수를 해도 빌드 오류 여부는 확인되지 않지만, 모델은 프로그램 구문이기 때문에 빌드 시 오류를 확인할 수 있다.
Entity Framework Core는 기존 데이터베이스에서 코드를 자동으로 생성하여 이러한 모델 및 데이터베이스에 연결할 수 있습니다. 반대로, 코드를 수동으로 작성한 다음 데이터베이스를 자동으로 생성하는 방법이 있습니다.
전자는 "데이터베이스 우선"이라고 하고 후자는 "코드 우선"이라고 합니다. ER 다이어그램과 같은 청사진에서 코드와 데이터베이스를 생성하는 "모델 우선"도 있지만 Entity Framework Core에서는 널리 사용되지 않습니다.
이 경우 데이터베이스가 이미 존재한다는 가정 하에 코드를 생성하는 "데이터베이스 우선" 패턴을 사용합니다.
SQL Server 설치
이 팁에서 SQL Server 데이터베이스에 액세스하려면 미리 SQL Server를 설정하세요. 개발 환경의 PC 또는 네트워크를 통해 다른 PC에 설정할 수 있습니다. 개발 환경에서 SQL Server에 연결할 수 있다면 계속 진행할 수 있습니다. 이 팁에서 SQL Server는 별도의 환경에 설치됩니다.
SQL Server 설치 단계는 중복되므로 생략됩니다. 다음 페이지에는 SQL Server 관련 팁이 포함되어 있으므로 설정 방법을 알고 싶다면 참조하시기 바랍니다.
테이블 만들기
이번에는 다음과 같은 데이터베이스와 테이블을 Mr./Ms.로 만듭니다.
- 데이터베이스 이름: TestDatabase
- 테이블 이름: 사용자
- 테이블 열: [ID], [이름], [비밀번호], [나이], [이메일], [생일], [업데이트날짜/시간]
어떤 방법으로든 만들 수 있지만 원하지 않는 경우 SQL Server에 대해 다음 SQL을 실행하여 생성합니다.
다음은 데이터베이스 생성 SQL이지만, 버전 등에 따라 데이터베이스 생성 경로가 변경되기 때문에 SQL 대신 GUI나 명령어로 생성하는 것이 더 신뢰성이 높을 수 있습니다.
USE [master]
GO
CREATE DATABASE [TestDatabase]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'TestDatabase', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'TestDatabase_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\TestDatabase_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
WITH CATALOG_COLLATION = DATABASE_DEFAULT, LEDGER = OFF
GO
ALTER DATABASE [TestDatabase] SET COMPATIBILITY_LEVEL = 160
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TestDatabase].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [TestDatabase] SET ANSI_NULLS OFF
GO
ALTER DATABASE [TestDatabase] SET ANSI_PADDING OFF
GO
ALTER DATABASE [TestDatabase] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [TestDatabase] SET ARITHABORT OFF
GO
ALTER DATABASE [TestDatabase] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [TestDatabase] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [TestDatabase] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [TestDatabase] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [TestDatabase] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [TestDatabase] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [TestDatabase] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [TestDatabase] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [TestDatabase] SET DISABLE_BROKER
GO
ALTER DATABASE [TestDatabase] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [TestDatabase] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [TestDatabase] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [TestDatabase] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [TestDatabase] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [TestDatabase] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [TestDatabase] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [TestDatabase] SET RECOVERY FULL
GO
ALTER DATABASE [TestDatabase] SET MULTI_USER
GO
ALTER DATABASE [TestDatabase] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [TestDatabase] SET DB_CHAINING OFF
GO
ALTER DATABASE [TestDatabase] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [TestDatabase] SET TARGET_RECOVERY_TIME = 60 SECONDS
GO
ALTER DATABASE [TestDatabase] SET DELAYED_DURABILITY = DISABLED
GO
ALTER DATABASE [TestDatabase] SET ACCELERATED_DATABASE_RECOVERY = OFF
GO
EXEC sys.sp_db_vardecimal_storage_format N'TestDatabase', N'ON'
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE = ON
GO
ALTER DATABASE [TestDatabase] SET QUERY_STORE (OPERATION_MODE = READ_WRITE, CLEANUP_POLICY = (STALE_QUERY_THRESHOLD_DAYS = 30), DATA_FLUSH_INTERVAL_SECONDS = 900, INTERVAL_LENGTH_MINUTES = 60, MAX_STORAGE_SIZE_MB = 1000, QUERY_CAPTURE_MODE = AUTO, SIZE_BASED_CLEANUP_MODE = AUTO, MAX_PLANS_PER_QUERY = 200, WAIT_STATS_CAPTURE_MODE = ON)
GO
ALTER DATABASE [TestDatabase] SET READ_WRITE
GO
테이블 생성 SQL.
USE [TestDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[User](
[ID] [int] NOT NULL,
[Name] [nvarchar](20) NOT NULL,
[Password] [nvarchar](20) NOT NULL,
[Age] [int] NULL,
[Email] [nvarchar](200) NULL,
[Birthday] [date] NULL,
[UpdateDateTime] [datetime2](7) NULL,
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SQL을 추가합니다.
USE [TestDatabase]
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (1, N'氏名1', N'aaaa', 20, N'aaaa@example.com', CAST(N'2020-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
INSERT [dbo].[User] ([ID], [Name], [Password], [Age], [Email], [Birthday], [UpdateDateTime]) VALUES (2, N'氏名2', N'bbbb', 30, N'bbbb@example.com', CAST(N'2010-04-01' AS Date), CAST(N'2021-03-14T00:00:00.0000000' AS DateTime2))
GO
Visual Studio 설치
이 항목도 이미 설정했다고 가정합니다. 설정 절차 등을 알고 싶은 경우 다음 페이지에 정리되어 있습니다.
프로젝트 만들기
Entity Framework Core는 특정 실행 환경에 종속되지 않으므로 많은 프로젝트에서 사용할 수 있습니다. 이 문서에서는 간단한 콘솔 애플리케이션 환경에서 Entity Framework Core를 사용합니다.
새 프로젝트에서 콘솔 앱을 선택합니다.
프로젝트가 생성되었습니다. 프로젝트 이름이 무엇인지는 중요하지 않습니다.
Entity Framework Core 패키지 가져오기
NuGet과 함께 Entity Framework Core를 사용하기 위한 패키지를 가져옵니다.
종속성을 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다.
탭에서 "찾아보기"를 선택한 상태에서 검색 필드에 입력합니다 EntityFrameworkCore
. 그러면 목록에 Entity Framework Core 관련 패키지가 표시됩니다.
이번에는 SQL Server를 사용하므로 다음 패키지를 설치합니다.
- Microsoft.EntityFrameworkCore (영문)
- Microsoft.EntityFrameworkCore.Tools (영문)
- Microsoft.EntityFrameworkCore.SqlServer (영문)
Microsoft.EntityFrameworkCore
이 예에서는 . 다른 두 개도 설치하십시오.
설치 대상을 선택하고 설치 버튼을 클릭합니다. 버전의 경우 최신 안정 버전을 선택합니다.
대화 상자는 기본적으로 OK이며 OK를 클릭할 수 있습니다.
다른 두 개도 설치하십시오.
패키지는 다음과 같다고 생각합니다.
데이터베이스 테이블 구조에서 모델(코드) 만들기Create a model (code) from a database table structure
모델 및 기타 코드가 자동으로 생성되도록 하려면 먼저 프로젝트를 빌드하여 오류가 없는지 확인합니다. 오류가 있는 경우 모델 생성이 실패합니다. 오류가 없음을 이미 확인한 경우 빌드할 필요가 없습니다.
Visual Studio에서 패키지 관리자 콘솔을 엽니다. 없는 경우 "도구", "NuGet 패키지 관리자", "패키지 관리자 콘솔" 메뉴에서 열 수 있습니다.
다음과 같은 창이 표시되므로 오른쪽 상단의 "기본 프로젝트"가 모델을 만들려는 프로젝트인지 확인하십시오. (프로젝트가 여러 개인 경우 주의가 필요합니다)
입력 필드에 다음 텍스트를 입력합니다. 매개 변수는 환경에 따라 변경되므로 다음 설명에 따라 적시에 변경하십시오.
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=<サーバー名>\<インスタンス名>;Database=<データメース名>;user id=<接続ユーザー名>;password=<接続パスワード>;TrustServerCertificate=true" -f -OutputDir "<出力フォルダパス>" -Context "<コンテキストクラス名>" -UseDatabaseNames -DataAnnotations -NoPluralize
예제 입력
Scaffold-DbContext -Provider Microsoft.EntityFrameworkCore.SqlServer -Connection "Data Source=TestServer;Database=TestDatabase;user id=TestUser;password=pass;TrustServerCertificate=true" -f -OutputDir "Models\Database" -Context "TestDatabaseDbContext" -UseDatabaseNames -DataAnnotations -NoPluralize
파라미터 | 설명파라미터 | 예 |
---|---|---|
공급자 | SQL Server의 경우 고정되어 있습니다 Microsoft.EntityFrameworkCore.SqlServer . |
Microsoft.EntityFrameworkCore.SqlServer (영문) |
연결 | 데이터베이스에 연결할 연결 문자열입니다. 연결 문자열은 다른 앱과 공통으로 사용할 수 있으므로 지정할 콘텐츠에 대한 연결 문자열의 표기법을 따르세요. Windows 인증 또는 SQL Server 인증을 사용할 수 있습니다. 그건 그렇고, 모델을 만드는 데 임시로만 사용되므로 이 연결 문자열에 대한 응용 프로그램을 게시한 후에는 보안에 대해 인식할 필요가 없습니다. 암호에 기호가 있으면 탈출하지 않도록 주의하십시오. | "데이터 소스=ServerName\SQLEXPRESS; 데이터베이스=TestDatabase; 사용자 id=사용자 이름; 비밀번호=**********" |
f | 프로그램이 이미 존재하더라도 강제로 덮어 씁니다. | <> 없음 |
OutputDir (출력디렉토리) | 코드를 출력할 폴더 경로입니다. 프로젝트 폴더에 상대적인 경로 | 모델\데이터베이스 |
문맥 | Entity Framework를 사용할 때의 컨텍스트 클래스 이름 | TestDatabaseDb컨텍스트 |
UseDatabaseNames (데이터베이스 이름 사용) | 지정된 경우 데이터베이스의 테이블 이름은 그대로 클래스 이름이 됩니다. 지정하지 않으면 엔터티 클래스 이름의 대/소문자가 규칙에 따라 조정됩니다. | <> 없음 |
DataAnnotations (데이터 어노테이션) | 지정된 경우 열 형식은 각 속성에 DataAnnotation 특성을 자동으로 추가합니다. 이는 데이터베이스 유형에 따라 입력 검사를 자동으로 수행하려는 경우에 약간 유용합니다. | <> 없음 |
네임스페이스 | 생성된 엔터티 클래스가 속한 네임스페이스입니다. 지정하지 않으면 네임스페이스는 폴더에 따라 결정됩니다. | Test네임스페이스 |
컨텍스트 네임스페이스 | 생성된 Context가 속한 네임스페이스입니다. 지정하지 않으면 네임스페이스는 폴더에 따라 결정됩니다. | Test네임스페이스 |
NoOn구성 | 코드에 원시 연결 문자열을 포함하지 마세요. | <> 없음 |
NoPluralize (복수 없음) | 컨텍스트의 각 테이블 이름에 대한 속성 이름이 복수형이 아닌지 확인합니다. | <> 없음 |
Enter 키를 눌러 실행하면 코드가 자동으로 생성됩니다. 오류가 발생하면 그 이유가 표시되므로 오류 내용에 따라 대응하십시오.
User
테이블의 모델 코드는 다음과 같습니다.
using System.ComponentModel.DataAnnotations;
namespace SetupSqlServerDatabaseFirst.Models.Database;
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; } = null!;
public int? Age { get; set; }
[StringLength(200)]
public string? Email { get; set; }
public DateOnly? Birthday { get; set; }
public DateTime? UpdateDateTime { get; set; }
}
그건 그렇고, 연결 문자열이 생성 된 컨텍스트 클래스의 코드에 그대로 작성되기 때문에 경고가 표시됩니다. 가능하면 연결 문자열을 별도의 장소에 저장하고 런타임에 설정하는 것이 좋지만,이 경우는 동작을 확인하기 위한 것이므로 그대로 두겠습니다.
레코드를 검색하고 표시해 보십시오.
이제 데이터베이스의 레코드에 액세스할 수 있는 코드가 있으므로 레코드를 검색하여 콘솔에 표시해 보겠습니다.
Program.cs
그리고 다음과 같이 수정합니다.
// See https://aka.ms/new-console-template for more information
using SetupSqlServerDatabaseFirst.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));
}
에서 자동 생성된 DbContext
클래스를 new
생성합니다. 데이터베이스 연결이 자동으로 파괴될 수 using var
있도록 선언되어 있습니다.
dbContext
각 모델에 액세스하기 위해 속성을 생성하므로 이 경우 User
속성에 액세스하여 User
테이블의 레코드를 조작할 수 있습니다.
발행된 SQL은 내부적으로 자동으로 생성되므로 알아둘 필요가 없습니다.
ToList
여기서 확장 메서드는 테이블의 모든 레코드를 검색하는 User
데 사용됩니다.
foreach
나머지는 and JsonSerializer.Serialize
메소드를 User
사용하여 콘솔에 정보를 표시합니다.
User
위에서 언급했듯이 테이블의 각 열은 속성으로 선언되므로 값을 개별적으로 검색할 수 있습니다.