기존 데이터베이스에 대한 Code First
이 단계별 연습에서는 기존 데이터베이스를 대상으로 하는 Code First 개발을 소개합니다. Code First를 사용하면 C# 또는 VB.NET 클래스를 사용해 모델을 정의할 수 있습니다. 클래스 및 속성의 특성을 사용하거나 흐름 API를 사용하여 필요에 따라 추가 구성을 수행할 수 있습니다.
필수 구성 요소
이 연습을 완료하려면 Visual Studio 2012 또는 Visual Studio 2013이 설치되어 있어야 합니다.
또는 Visual Studio용 Entity Framework Tools 버전 6.1(이상)이 설치되어 있어야 합니다. 최신 버전의 Entity Framework Tools 설치에 대한 자세한 내용은 Entity Framework 가져오기를 참조하세요.
1. 기존 데이터베이스 만들기
일반적으로 기존 데이터베이스를 대상으로 하는 경우 이미 만들어져 있겠지만 이 연습에서는 액세스할 데이터베이스를 만들어야 합니다.
그럼 계속해서 데이터베이스를 생성해 보겠습니다.
Visual Studio를 엽니다.
보기 -> 서버 탐색기
데이터 연결 -> 연결 추가...를 마우스 오른쪽 단추로 클릭합니다.
서버 탐색기에서 데이터베이스에 아직 연결하지 않은 경우 Microsoft SQL Server를 데이터 원본으로 선택해야 합니다.
LocalDB 인스턴스에 연결하고 데이터베이스 이름으로 Blogging을 입력합니다.
확인을 선택하여 새 데이터베이스를 만들 것인지 묻는 메시지가 표시되면 예를 선택합니다.
이제 새 데이터베이스가 서버 탐색기에 표시됩니다. 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다.
다음 SQL을 새 쿼리에 복사한 다음 쿼리를 마우스 오른쪽 단추로 클릭하고 실행을 선택합니다.
CREATE TABLE [dbo].[Blogs] (
[BlogId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (200) NULL,
[Url] NVARCHAR (200) NULL,
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);
CREATE TABLE [dbo].[Posts] (
[PostId] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (200) NULL,
[Content] NTEXT NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')
INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')
2. 애플리케이션 만들기
작업을 간단하게 유지하기 위해 Code First를 사용하여 데이터 액세스를 수행하는 기본 콘솔 애플리케이션을 빌드하겠습니다.
- Visual Studio를 엽니다.
- 파일 -> 새로 만들기 -> 프로젝트
- 왼쪽 메뉴에서 Windows를 선택하고 콘솔 애플리케이션을 선택합니다.
- 이름으로 CodeFirstExistingDatabaseSample을 입력합니다.
- 확인을 선택합니다.
3. 리버스 엔지니어링 모델
Visual Studio용 Entity Framework Tools를 사용하여 데이터베이스에 매핑할 몇 가지 초기 코드를 생성할 것입니다. 이러한 도구는 원하는 경우 직접 입력할 수도 있는 코드를 생성합니다.
프로젝트 -> 새 항목 추가…
왼쪽 창에서 데이터를 선택한 다음, ADO.NET 엔터티 데이터 모델을 선택합니다.
이름으로 BloggingContext를 입력하고 확인을 클릭합니다.
그러면 엔터티 데이터 모델 마법사가 시작됩니다.
데이터베이스의 Code First를 선택하고 다음을 클릭합니다.
첫 번째 섹션에서 만든 데이터베이스에 대한 연결을 선택하고 다음을 클릭합니다.
테이블 옆의 확인란을 클릭하여 모든 테이블을 가져오고 마침을 클릭합니다.
리버스 엔지니어링 프로세스가 완료되면 프로젝트에 여러 항목이 추가됩니다. 추가된 항목을 살펴보겠습니다.
구성 파일
App.config 파일이 프로젝트에 추가되었습니다. 이 파일에는 기존 데이터베이스에 대한 연결 문자열이 포함되어 있습니다.
<connectionStrings>
<add
name="BloggingContext"
connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
providerName="System.Data.SqlClient" />
</connectionStrings>
구성 파일에서 다른 설정도 확인할 수 있습니다. 이는 Code First에서 데이터베이스를 만들 위치를 알려주는 기본 EF 설정입니다. 기존 데이터베이스에 매핑되므로 이러한 설정은 애플리케이션에서 무시됩니다.
파생 컨텍스트
BloggingContext 클래스가 프로젝트에 추가되었습니다. 데이터베이스가 있는 세션을 나타내는 컨텍스트이며 데이터를 쿼리하고 저장할 수 있습니다. 컨텍스트는 모델의 각 형식에 대해 DbSet<TEntity>를 공개합니다. 또한 기본 생성자는 name= 구문을 사용하여 기본 생성자를 호출합니다. 그러면 이 컨텍스트에 사용할 연결 문자열을 구성 파일에서 로드해야 함을 Code First에 알려줍니다.
public partial class BloggingContext : DbContext
{
public BloggingContext()
: base("name=BloggingContext")
{
}
public virtual DbSet<Blog> Blogs { get; set; }
public virtual DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
}
}
구성 파일에서 연결 문자열을 사용하는 경우 항상 name= 구문을 사용해야 합니다. 이렇게 하면 연결 문자열이 없는 경우 규칙에 따라 새 데이터베이스를 만드는 대신 Entity Framework가 throw됩니다.
모델 클래스
마지막으로 블로그 및 게시물 클래스도 프로젝트에 추가되었습니다. 이러한 클래스는 모델을 구성하는 도메인 클래스입니다. Code First 규칙이 기존 데이터베이스의 구조와 일치하지 않는 구성을 지정하기 위해 클래스에 데이터 주석이 적용되는 것을 볼 수 있습니다. 예를 들어 데이터베이스에서 Blog.Name 및 Blog.Url의 최대 길이는 200이므로 StringLength 주석이 표시됩니다(Code First 기본값은 데이터베이스 공급자가 지원하는 최대 길이인 SQL Server의 nvarchar(max)).
public partial class Blog
{
public Blog()
{
Posts = new HashSet<Post>();
}
public int BlogId { get; set; }
[StringLength(200)]
public string Name { get; set; }
[StringLength(200)]
public string Url { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
4. 데이터 읽기 및 쓰기
이제 모델을 사용하여 일부 데이터에 액세스해야 합니다. 아래와 같이 Program.cs에서 Main 메서드를 구현합니다. 이 코드는 컨텍스트의 새 인스턴스를 만든 다음, 이를 사용하여 새 블로그를 삽입합니다. 그런 다음 LINQ 쿼리를 사용하여 제목별로 알파벳순으로 정렬된 데이터베이스에서 모든 블로그를 검색합니다.
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine();
var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;
Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
이제 애플리케이션을 실행하고 테스트할 수 있습니다.
Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...
내 데이터베이스가 변경되면 어떻게 해야 하나요?
Code First to Database 마법사는 조정하고 수정할 수 있는 클래스의 시작점 집합을 생성하도록 설계되었습니다. 데이터베이스 스키마가 변경되면 클래스를 수동으로 편집하거나 다른 리버스 엔지니어링을 수행하여 클래스를 덮어쓸 수 있습니다.
기존 데이터베이스에 대한 Code First 마이그레이션 사용
기존 데이터베이스에서 Code First 마이그레이션 사용하려면 기존 데이터베이스에 대한 Code First 마이그레이션을 참조하세요.
요약
이 연습에서는 기존 데이터베이스를 사용한 Code First 개발을 살펴보았습니다. Visual Studio용 Entity Framework Tools를 사용하여 데이터베이스에 매핑되고 데이터를 저장하고 검색하는 데 사용할 수 있는 클래스 집합을 리버스 엔지니어링했습니다.
.NET