Visual Studio 또는 Visual Web Developer를 사용 하 여 SQL Server Compact를 사용 하 여 ASP.NET 웹 응용 프로그램 배포: SQL Server Compact 데이터베이스 배포-2/12Deploying an ASP.NET Web Application with SQL Server Compact using Visual Studio or Visual Web Developer: Deploying SQL Server Compact Databases - 2 of 12

만든 사람 Tom Dykstraby Tom Dykstra

시작 프로젝트 다운로드Download Starter Project

이 자습서 시리즈에서는 Visual Studio 2012 RC 또는 Visual Studio Express 2012 RC for Web을 사용 하 여 SQL Server Compact 데이터베이스를 포함 하는 ASP.NET 웹 응용 프로그램 프로젝트를 배포 (게시) 하는 방법을 보여 줍니다.This series of tutorials shows you how to deploy (publish) an ASP.NET web application project that includes a SQL Server Compact database by using Visual Studio 2012 RC or Visual Studio Express 2012 RC for Web. 웹 게시 업데이트를 설치 하는 경우 Visual Studio 2010을 사용할 수도 있습니다.You can also use Visual Studio 2010 if you install the Web Publish Update. 시리즈에 대 한 소개는 시리즈의 첫 번째 자습서를 참조 하십시오.For an introduction to the series, see the first tutorial in the series.

Visual Studio 2012의 RC 릴리스 후에 도입 된 배포 기능을 보여 주는 자습서는 SQL Server Compact 이외의 SQL Server 버전을 배포 하는 방법을 보여 주고 Azure App Service Web Apps에 배포 하는 방법을 보여 줍니다. Visual Studio를 사용 하 여 ASP.NET 웹 배포를 참조 하세요.For a tutorial that shows deployment features introduced after the RC release of Visual Studio 2012, shows how to deploy SQL Server editions other than SQL Server Compact, and shows how to deploy to Azure App Service Web Apps, see ASP.NET Web Deployment using Visual Studio.

개요Overview

이 자습서에서는 배포를 위해 두 개의 SQL Server Compact 데이터베이스와 데이터베이스 엔진을 설정 하는 방법을 보여 줍니다.This tutorial shows how to set up two SQL Server Compact databases and the database engine for deployment.

데이터베이스 액세스의 경우 Contoso 대학 응용 프로그램은 .NET Framework에 포함 되지 않으므로 응용 프로그램과 함께 배포 해야 하는 다음과 같은 소프트웨어가 필요 합니다.For database access, the Contoso University application requires the following software that must be deployed with the application because it is not included in the .NET Framework:

데이터베이스 구조와 응용 프로그램의 두 데이터베이스에 있는 데이터 중 일부 (모두 아님)도 배포 되어야 합니다.The database structure and some (not all) of the data in the application's two databases must also be deployed. 일반적으로 응용 프로그램을 개발할 때 라이브 사이트에 배포 하지 않을 데이터베이스에 테스트 데이터를 입력 합니다.Typically, as you develop an application, you enter test data into a database that you don't want to deploy to a live site. 그러나 배포 하려는 일부 프로덕션 데이터를 입력할 수도 있습니다.However, you might also enter some production data that you do want to deploy. 이 자습서에서는를 배포할 때 필요한 소프트웨어와 올바른 데이터가 포함 되도록 Contoso 대학 프로젝트를 구성 합니다.In this tutorial you'll configure the Contoso University project so that the required software and the correct data are included when you deploy.

미리 알림: 자습서를 진행할 때 오류 메시지가 표시 되거나 문제가 해결 되지 않으면 문제 해결 페이지를 확인 해야 합니다.Reminder: If you get an error message or something doesn't work as you go through the tutorial, be sure to check the troubleshooting page.

SQL Server Compact 대 SQL Server ExpressSQL Server Compact versus SQL Server Express

샘플 응용 프로그램은 SQL Server Compact 4.0를 사용 합니다.The sample application uses SQL Server Compact 4.0. 이 데이터베이스 엔진은 웹 사이트에 대 한 비교적 새로운 옵션입니다. 이전 버전의 SQL Server Compact는 웹 호스팅 환경에서 작동 하지 않습니다.This database engine is a relatively new option for websites; earlier versions of SQL Server Compact do not work in a web hosting environment. SQL Server Compact은 SQL Server Express를 사용 하 여 개발 하 고 전체 SQL Server에 배포 하는 보다 일반적인 시나리오에 비해 몇 가지 이점을 제공 합니다.SQL Server Compact offers a few benefits compared to the more common scenario of developing with SQL Server Express and deploying to full SQL Server. 선택한 호스팅 공급자에 따라 일부 공급자는 전체 SQL Server 데이터베이스를 지원 하기 위해 추가 비용을 부과 하므로 배포 비용이 더 적게 SQL Server Compact.Depending on the hosting provider you choose, SQL Server Compact might be cheaper to deploy, because some providers charge extra to support a full SQL Server database. 웹 응용 프로그램의 일부로 데이터베이스 엔진 자체를 배포할 수 있으므로 SQL Server Compact에 대 한 추가 요금이 부과 되지 않습니다.There is no extra charge for SQL Server Compact because you can deploy the database engine itself as part of your web application.

그러나 이러한 제한 사항에 대해서도 알고 있어야 합니다.However, you should also be aware of its limitations. SQL Server Compact는 저장 프로시저, 트리거, 뷰 또는 복제를 지원 하지 않습니다.SQL Server Compact does not support stored procedures, triggers, views, or replication. SQL Server Compact에서 지원 하지 않는 SQL Server 기능의 전체 목록은 SQL Server Compact와 SQL Server의 차이점을 참조 하세요.) 또한 SQL Server Express 및 SQL Server 데이터베이스에서 스키마 및 데이터를 조작 하는 데 사용할 수 있는 일부 도구는 SQL Server Compact에서 작동 하지 않습니다.(For a complete list of SQL Server features that are not supported by SQL Server Compact, see Differences Between SQL Server Compact and SQL Server.) Also, some of the tools that you can use to manipulate schemas and data in SQL Server Express and SQL Server databases do not work with SQL Server Compact. 예를 들어 Visual Studio의 SQL Server Compact 데이터베이스에서 SQL Server Management Studio 또는 SQL Server Data Tools를 사용할 수 없습니다.For example, you cannot use SQL Server Management Studio or SQL Server Data Tools in Visual Studio with SQL Server Compact databases. SQL Server Compact 데이터베이스를 사용 하기 위한 다른 옵션이 있습니다.You do have other options for working with SQL Server Compact databases:

  • SQL Server Compact에 대해 제한 된 데이터베이스 조작 기능을 제공 하는 Visual Studio에서 서버 탐색기를 사용할 수 있습니다.You can use Server Explorer in Visual Studio, which offers limited database manipulation functionality for SQL Server Compact.
  • 서버 탐색기 보다 많은 기능을 포함 하는 WebMatrix의 데이터베이스 조작 기능을 사용할 수 있습니다.You can use the database manipulation feature of WebMatrix, which has more features than Server Explorer.
  • SQL Server Compact 도구 상자SQL Compact 데이터 및 스키마 스크립트 유틸리티와 같은 비교적 완전 한 기능의 타사 또는 오픈 소스 도구를 사용할 수 있습니다.You can use relatively full-featured third-party or open source tools, such as the SQL Server Compact Toolbox and SQL Compact data and schema script utility.
  • 고유한 DDL (데이터 정의 언어) 스크립트를 작성 하 고 실행 하 여 데이터베이스 스키마를 조작할 수 있습니다.You can write and run your own DDL (data definition language) scripts to manipulate the database schema.

SQL Server Compact 시작 하 고 필요에 따라 나중에 업그레이드할 수 있습니다.You can start with SQL Server Compact and then upgrade later as your needs evolve. 이 시리즈의 이후 자습서에서는 SQL Server Compact에서 SQL Server Express으로, SQL Server으로 마이그레이션하는 방법을 보여 줍니다.Later tutorials in this series show you how to migrate from SQL Server Compact to SQL Server Express and to SQL Server. 그러나 새 응용 프로그램을 만들고 가까운 장래에 SQL Server 필요할 것으로 생각 되는 경우 SQL Server 또는 SQL Server Express으로 시작 하는 것이 가장 좋습니다.However, if you're creating a new application and expect to need SQL Server in the near future, it's probably best to start with SQL Server or SQL Server Express.

배포용 SQL Server Compact 데이터베이스 엔진 구성Configuring the SQL Server Compact Database Engine for Deployment

다음 NuGet 패키지를 설치 하 여 Contoso 대학 응용 프로그램의 데이터 액세스에 필요한 소프트웨어를 추가 했습니다.The software required for data access in the Contoso University application was added by installing the following NuGet packages:

링크는 이러한 패키지의 최신 버전을 가리키기 때문에이 자습서에서 다운로드 한 시작 프로젝트에 설치 된 것 보다 최신 버전 일 수 있습니다.The links point to the current versions of these packages, which might be newer than what is installed in the starter project that you downloaded for this tutorial. 호스팅 공급자에 배포 하려면 Entity Framework 5.0 이상을 사용 해야 합니다.For deployment to a hosting provider, make sure that you use Entity Framework 5.0 or later. 이전 버전의 Code First 마이그레이션에는 완전 신뢰가 필요 하며, 대부분의 호스팅 공급자에서 응용 프로그램은 보통 신뢰 수준으로 실행 됩니다.Earlier versions of Code First Migrations require Full Trust, and at many hosting providers your application will run in Medium Trust. 보통 신뢰에 대 한 자세한 내용은 테스트 환경으로 IIS에 배포 자습서를 참조 하세요.For more information about Medium Trust, see the Deploying to IIS as a Test Environment tutorial.

NuGet 패키지 설치는 일반적으로 응용 프로그램과 함께이 소프트웨어를 배포 하기 위해 필요한 모든 항목을 처리 합니다.NuGet package installation generally takes care of everything that you need in order to deploy this software with the application. 일부 경우에는 Web.config 파일을 변경 하 고 솔루션을 빌드할 때마다 실행 되는 PowerShell 스크립트를 추가 하는 등의 작업이 포함 됩니다.In some cases, this involves tasks such as changing the Web.config file and adding PowerShell scripts that run whenever you build the solution. NuGet을 사용 하지 않고 이러한 기능 (예: SQL Server Compact 및 Entity Framework)에 대 한 지원을 추가 하려는 경우 동일한 작업을 수동으로 수행할 수 있도록 NuGet 패키지 설치를 확인 해야 합니다.If you want to add support for any of these features (such as SQL Server Compact and Entity Framework) without using NuGet, make sure that you know what NuGet package installation does so that you can do the same work manually.

성공적인 배포를 위해 NuGet에서 수행 해야 하는 모든 작업을 수행 해야 하는 한 가지 예외가 있습니다.There is one exception where NuGet doesn't take care of everything you have to do in order to ensure successful deployment. SqlServerCompact NuGet 패키지는 프로젝트 bin 폴더의 x86amd64 하위 폴더에 네이티브 어셈블리를 복사 하는 빌드 후 스크립트를 프로젝트에 추가 하지만 스크립트는 프로젝트에 이러한 폴더를 포함 하지 않습니다.The SqlServerCompact NuGet package adds a post-build script to your project that copies the native assemblies to x86 and amd64 subfolders under the project bin folder, but the script does not include those folders in the project. 따라서 프로젝트에 수동으로 포함 하지 않는 한 웹 배포는 대상 웹 사이트에 해당 파일을 복사 하지 않습니다.As a result, Web Deploy will not copy them to the destination web site unless you manually include them in the project. 이 동작은 기본 배포 구성으로 인해 발생 합니다. 이러한 자습서에서 사용 하지 않는 또 다른 옵션은이 동작을 제어 하는 설정을 변경 하는 것입니다.(This behavior results from the default deployment configuration; another option, which you won't use in these tutorials, is to change the setting that controls this behavior. 변경할 수 있는 설정은 프로젝트 속성 창의 웹 패키지 및 게시 탭에 있는 배포할 항목 에서 응용 프로그램을 실행 하는 데 필요한 파일 입니다.The setting that you can change is Only files needed to run the application under Items to deploy on the Package/Publish Web tab of the Project Properties window. 이 설정을 변경 하는 것은 필요한 것 보다 많은 파일을 프로덕션 환경에 배포할 수 있기 때문에 일반적으로 권장 되지 않습니다.Changing this setting is not generally recommended because it can result in the deployment of many more files to the production environment than are needed there. 대안에 대 한 자세한 내용은 프로젝트 속성 구성 자습서를 참조 하세요.For more information about the alternatives, see the Configuring Project Properties tutorial.)

프로젝트를 빌드한 다음 솔루션 탐색기 모든 파일 표시 를 클릭 합니다 (아직 수행 하지 않은 경우).Build the project, and then in Solution Explorer click Show all Files if you have not already done so. 새로 고침을 클릭 해야 할 수도 있습니다.You might also have to click Refresh.

Solution_Explorer_Show_All_Files

Bin 폴더를 확장 하 여 amd64x86 폴더를 표시 한 다음 해당 폴더를 선택 하 고 마우스 오른쪽 단추를 클릭 한 다음 프로젝트에 포함을 선택 합니다.Expand the bin folder to see the amd64 and x86 folders, and then select those folders, right-click, and select Include in Project.

amd64_and_x86_in_Solution_Explorer.png

폴더 아이콘이 프로젝트에 포함 되어 있음을 표시 하도록 변경 됩니다.The folder icons change to show that the folder has been included in the project.

Solution_Explorer_amd64_included.png

응용 프로그램 데이터베이스 배포를 위한 Code First 마이그레이션 구성Configuring Code First Migrations for Application Database Deployment

응용 프로그램 데이터베이스를 배포 하는 경우 일반적으로 해당 데이터의 대부분이 테스트 목적 으로만 제공 되므로 프로덕션 환경에 모든 데이터를 포함 하는 개발 데이터베이스를 배포 하는 것은 간단 하지 않습니다.When you deploy an application database, typically you don't simply deploy your development database with all of the data in it to production, because much of the data in it is probably there only for testing purposes. 예를 들어 테스트 데이터베이스의 학생 이름은 가상입니다.For example, the student names in a test database are fictional. 반면에 데이터 없이 데이터베이스 구조만 배포할 수 없는 경우가 종종 있습니다.On the other hand, you often can't deploy just the database structure with no data in it at all. 테스트 데이터베이스의 일부 데이터는 실제 데이터가 될 수 있으며 사용자가 응용 프로그램을 사용 하기 시작할 때이 데이터를 사용 해야 합니다.Some of the data in your test database might be real data and must be there when users begin to use the application. 예를 들어 데이터베이스에 유효한 등급 값 또는 실제 부서 이름이 포함 된 테이블이 있을 수 있습니다.For example, your database might have a table that contains valid grade values or real department names.

이 일반적인 시나리오를 시뮬레이션 하기 위해 프로덕션에 있는 데이터만 데이터베이스에 삽입 하는 Code First 마이그레이션 초기값 메서드를 구성 합니다.To simulate this common scenario, you'll configure a Code First Migrations Seed method that inserts into the database only the data that you want to be there in production. 이 초기값 메서드는 프로덕션 환경에서 데이터베이스를 Code First 만든 후 프로덕션 환경에서 실행 되므로 테스트 데이터를 삽입 하지 않습니다.This Seed method won't insert test data because it will run in production after Code First creates the database in production.

이전 버전의 Code First 마이그레이션이 출시 되기 전에는 테스트 데이터를 삽입 하는 시드 방법이 일반적 이었습니다. 개발 중에 모든 모델이 변경 되 면 데이터베이스를 완전히 삭제 하 고 처음부터 다시 만들어야 하기 때문입니다.In earlier versions of Code First before Migrations was released, it was common for Seed methods to insert test data also, because with every model change during development the database had to be completely deleted and re-created from scratch. Code First 마이그레이션를 사용 하면 데이터베이스 변경 후에 테스트 데이터가 유지 되므로 시드 메서드에 테스트 데이터를 포함 하는 것은 필요 하지 않습니다.With Code First Migrations, test data is retained after database changes, so including test data in the Seed method is not necessary. 다운로드 한 프로젝트는 이니셜라이저 클래스의 초기값 메서드에 모든 데이터를 포함 하는 사전 마이그레이션 방법을 사용 합니다.The project you downloaded uses the pre-Migrations method of including all data in the Seed method of an initializer class. 이 자습서에서는 이니셜라이저 클래스를 사용 하지 않도록 설정 하 고 마이그레이션을 사용 하도록 설정 합니다.In this tutorial you'll disable the initializer class and enable Migrations. 그런 다음 프로덕션 환경에 삽입 하려는 데이터만 삽입 하도록 마이그레이션 구성 클래스에서 초기값 메서드를 업데이트 합니다.Then you'll update the Seed method in the Migrations configuration class so that it inserts only data that you want to be inserted in production.

다음 다이어그램은 응용 프로그램 데이터베이스의 스키마를 보여 줍니다.The following diagram illustrates the schema of the application database:

School_database_diagramSchool_database_diagram

이러한 자습서에서는 사이트가 처음 배포 될 때 StudentEnrollment 테이블이 비어 있는 것으로 가정 합니다.For these tutorials, you'll assume that the Student and Enrollment tables should be empty when the site is first deployed. 다른 테이블에는 응용 프로그램이 라이브 상태로 전환 될 때 미리 로드 해야 하는 데이터가 포함 되어 있습니다.The other tables contain data that has to be preloaded when the application goes live.

Code First 마이그레이션를 사용할 예정 이므로 더 이상 Dropcreatedatabaseifmodelchanges Code First 이니셜라이저를 사용할 필요가 없습니다.Since you will be using Code First Migrations, you no longer have to use the DropCreateDatabaseIfModelChanges Code First initializer. 이 이니셜라이저의 코드는 ContosoUniversity 프로젝트의 SchoolInitializer.cs 파일에 있습니다.The code for this initializer is in the SchoolInitializer.cs file in the ContosoUniversity.DAL project. Web.config 파일의 appSettings 요소에 설정 되어 있으면 응용 프로그램이 처음으로 데이터베이스에 액세스 하려고 할 때마다이 이니셜라이저가 실행 됩니다.A setting in the appSettings element of the Web.config file causes this initializer to run whenever the application tries to access the database for the first time:

<appSettings>
  <add key="Environment" value="Dev" />
  <add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>

응용 프로그램 Web.config 파일을 열고 appSettings 요소에서 Code First 이니셜라이저 클래스를 지정 하는 요소를 제거 합니다.Open the application Web.config file and remove the element that specifies the Code First initializer class from the appSettings element. 이제 appSettings 요소는 다음과 같습니다.The appSettings element now looks like this:

<appSettings>
  <add key="Environment" value="Dev" />
</appSettings>

Note

이니셜라이저 클래스를 지정 하는 또 다른 방법은 global.asax 파일의 Application_Start 메서드에서 Database.SetInitializer를 호출 하는 것입니다.Another way to specify an initializer class is do it by calling Database.SetInitializer in the Application_Start method in the Global.asax file. 해당 메서드를 사용 하 여 이니셜라이저를 지정 하는 프로젝트에서 마이그레이션을 사용 하도록 설정 하는 경우 해당 코드 줄을 제거 합니다.If you are enabling Migrations in a project that uses that method to specify the initializer, remove that line of code.

다음으로 Code First 마이그레이션를 사용 하도록 설정 합니다.Next, enable Code First Migrations.

첫 번째 단계는 ContosoUniversity 프로젝트가 시작 프로젝트로 설정 되어 있는지 확인 하는 것입니다.The first step is to make sure that the ContosoUniversity project is set as the startup project. 솔루션 탐색기에서 ContosoUniversity 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 시작 프로젝트로 설정을 선택 합니다.In Solution Explorer, right-click the ContosoUniversity project and select Set as Startup Project. Code First 마이그레이션는 시작 프로젝트에서 데이터베이스 연결 문자열을 찾습니다.Code First Migrations will look in the startup project to find the database connection string.

도구 메뉴에서 NuGet 패키지 관리자, 패키지 관리자 콘솔을 차례로 클릭합니다.From the Tools menu, click NuGet Package Manager and then Package Manager Console.

Selecting_Package_Manager_Console

패키지 관리자 콘솔 창의 맨 위에 있는 ContosoUniversity를 기본 프로젝트로 선택 하 고 PM> 프롬프트에서 "마이그레이션 사용"을 입력 합니다.At the top of the Package Manager Console window select ContosoUniversity.DAL as the default project and then at the PM> prompt enter "enable-migrations".

enable-migrations_command

이 명령은 ContosoUniversity 프로젝트의 새 마이그레이션 폴더에 Configuration.cs 파일을 만듭니다.This command creates a Configuration.cs file in a new Migrations folder in the ContosoUniversity.DAL project.

Migrations_folder_in_Solution_Explorer

Code First 컨텍스트 클래스를 포함 하는 프로젝트에서 "마이그레이션 사용" 명령을 실행 해야 하므로 DAL 프로젝트를 선택 했습니다.You selected the DAL project because the "enable-migrations" command must be executed in the project that contains the Code First context class. 클래스가 클래스 라이브러리 프로젝트에 있는 경우 솔루션에 대 한 시작 프로젝트에서 데이터베이스 연결 문자열을 찾습니다 Code First 마이그레이션.When that class is in a class library project, Code First Migrations looks for the database connection string in the startup project for the solution. ContosoUniversity 솔루션에서 웹 프로젝트는 시작 프로젝트로 설정 되었습니다.In the ContosoUniversity solution, the web project has been set as the startup project. Visual Studio에서 연결 문자열이 있는 프로젝트를 시작 프로젝트로 지정 하지 않으려는 경우 PowerShell 명령에서 시작 프로젝트를 지정할 수 있습니다.(If you did not want to designate the project that has the connection string as the startup project in Visual Studio, you can specify the startup project in the PowerShell command. 마이그레이션 사용 명령에 대 한 명령 구문을 보려면 "get-help 사용-마이그레이션" 명령을 입력 하면 됩니다.To see the command syntax for the enable-migrations command, you can enter the command "get-help enable-migrations".)

Configuration.cs 파일을 열고 Seed 메서드의 주석을 다음 코드로 바꿉니다.Open the Configuration.cs file and replace the comments in the Seed method with the following code:

var instructors = new List<Instructor>
{   
    new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
    new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
    new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
    new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15") },
    new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12") }
};
instructors.ForEach(s => context.Instructors.AddOrUpdate(i => i.LastName, s));
context.SaveChanges();

var departments = new List<Department>
{
    new Department { Name = "English",     Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 1 },
    new Department { Name = "Mathematics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 2 },
    new Department { Name = "Engineering", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 3 },
    new Department { Name = "Economics",   Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 4 }
};
departments.ForEach(s => context.Departments.AddOrUpdate(d => d.Name, s));
context.SaveChanges();

var courses = new List<Course>
{
    new Course { CourseID = 1050, Title = "Chemistry",      Credits = 3, DepartmentID = 3, Instructors = new List<Instructor>() },
    new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1, Instructors = new List<Instructor>() },
    new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1, Instructors = new List<Instructor>() }
};
courses.ForEach(s => context.Courses.AddOrUpdate(s));
context.SaveChanges();

courses[0].Instructors.Add(instructors[0]);
courses[0].Instructors.Add(instructors[1]);
courses[1].Instructors.Add(instructors[2]);
courses[2].Instructors.Add(instructors[2]);
courses[3].Instructors.Add(instructors[3]);
courses[4].Instructors.Add(instructors[3]);
courses[5].Instructors.Add(instructors[3]);
courses[6].Instructors.Add(instructors[3]);
context.SaveChanges();

네임 스페이스에 대 한 using 문이 아직 없기 때문에 List에 대 한 참조에는 빨간색 물결선이 있습니다.The references to List have red squiggly lines under them because you don't have a using statement for its namespace yet. List 인스턴스 중 하나를 마우스 오른쪽 단추로 클릭 하 고 해결을 클릭 한 다음, Collections 사용을 클릭 합니다.Right-click one of the instances of List and click Resolve, and then click using System.Collections.Generic.

Using 문을 사용 하 여 확인

이 메뉴를 선택 하면 파일 위쪽 근처의 using 문에 다음 코드가 추가 됩니다.This menu selection adds the following code to the using statements near the top of the file.

using System.Collections.Generic;

Note

Seed 메서드에 코드를 추가 하는 것은 데이터베이스에 고정 데이터를 삽입할 수 있는 여러 가지 방법 중 하나입니다.Adding code to the Seed method is one of many ways that you can insert fixed data into the database. 다른 방법은 각 마이그레이션 클래스의 UpDown 메서드에 코드를 추가 하는 것입니다.An alternative is to add code to the Up and Down methods of each migration class. UpDown 메서드에는 데이터베이스 변경 내용을 구현 하는 코드가 포함 되어 있습니다.The Up and Down methods contain code that implements database changes. 데이터베이스 업데이트 배포 자습서에서 예제를 볼 수 있습니다.You'll see examples of them in the Deploying a Database Update tutorial.

Sql 메서드를 사용 하 여 SQL 문을 실행 하는 코드를 작성할 수도 있습니다.You can also write code that executes SQL statements by using the Sql method. 예를 들어 예산 열을 부서 테이블에 추가 하 고 마이그레이션의 일부로 모든 부서 예산을 $1000.00로 초기화 하려는 경우 해당 마이그레이션의 Up 메서드에 다음 코드 줄을 추가할 수 있습니다.For example, if you were adding a Budget column to the Department table and wanted to initialize all department budgets to $1,000.00 as part of a migration, you could add the following line of code to the Up method for that migration:

Sql("UPDATE Department SET Budget = 1000");

이 자습서에 대해 보여 주는이 예제에서는 Code First 마이그레이션 Configuration 클래스의 Seed 메서드에 있는 AddOrUpdate 메서드를 사용 합니다.This example shown for this tutorial uses the AddOrUpdate method in the Seed method of the Code First Migrations Configuration class. Code First 마이그레이션은 모든 마이그레이션 후에 Seed 메서드를 호출 하 고,이 메서드는 이미 삽입 된 행을 업데이트 하거나 아직 존재 하지 않는 경우 삽입 합니다.Code First Migrations calls the Seed method after every migration, and this method updates rows that have already been inserted, or inserts them if they don't exist yet. AddOrUpdate 방법이 시나리오에 가장 적합 한 선택이 아닐 수 있습니다.The AddOrUpdate method might not be the best choice for your scenario. 자세한 내용은 Julie Lerman의 블로그에서 EF 4.3 AddOrUpdate 메서드를 사용 하 여 처리 를 참조 하세요.For more information, see Take care with EF 4.3 AddOrUpdate Method on Julie Lerman's blog.

CTRL + SHIFT + B를 눌러 프로젝트를 빌드합니다.Press CTRL-SHIFT-B to build the project.

다음 단계는 초기 마이그레이션에 대 한 DbMigration 클래스를 만드는 것입니다.The next step is to create a DbMigration class for the initial migration. 이 마이그레이션을 통해 새 데이터베이스를 만들 수 있으므로 이미 존재 하는 데이터베이스를 삭제 해야 합니다.You want this migration to create a new database, so you have to delete the database that already exists. SQL Server Compact 데이터베이스는 응용 프로그램_Data 폴더의 .sdf 파일에 포함 되어 있습니다.SQL Server Compact databases are contained in .sdf files in the App_Data folder. 솔루션 탐색기에서 ContosoUniversity 프로젝트의 앱_데이터 를 확장 하 여 .sdf 파일로 표시 되는 두 개의 SQL Server Compact 데이터베이스를 확인 합니다.In Solution Explorer, expand App_Data in the ContosoUniversity project to see the two SQL Server Compact databases, which are represented by .sdf files.

School .sdf 파일을 마우스 오른쪽 단추로 클릭 하 고 삭제를 클릭 합니다.Right-click the School.sdf file and click Delete.

sdf_files_in_Solution_Explorer

패키지 관리자 콘솔 창에서 "추가 마이그레이션 초기" 명령을 입력 하 여 초기 마이그레이션을 만들고 이름을 "초기"로 이름을 입력 합니다.In the Package Manager Console window, enter the command "add-migration Initial" to create the initial migration and name it "Initial".

add-migration_command

Code First 마이그레이션는 마이그레이션 폴더에 다른 클래스 파일을 만들고,이 클래스에는 데이터베이스 스키마를 만드는 코드가 포함 되어 있습니다.Code First Migrations creates another class file in the Migrations folder, and this class contains code that creates the database schema.

패키지 관리자 콘솔에서 "업데이트-데이터베이스" 명령을 입력 하 여 데이터베이스를 만들고 초기값 메서드를 실행 합니다.In the Package Manager Console, enter the command "update-database" to create the database and run the Seed method.

update-database_command

테이블이 이미 존재 하 고 만들 수 없음을 나타내는 오류가 발생 하는 경우 데이터베이스를 삭제 한 후 update-database를 실행 하기 전에 응용 프로그램을 실행 했기 때문일 수 있습니다.(If you get an error that indicates a table already exists and can't be created, it is probably because you ran the application after you deleted the database and before you executed update-database. 이 경우 School 파일을 다시 삭제 하 고 update-database 명령을 다시 시도 하세요.)In that case, delete the School.sdf file again and retry the update-database command.)

애플리케이션을 실행합니다.Run the application. 이제 학생 페이지가 비어 있지만 강사 페이지가 강사를 포함 합니다.Now the Students page is empty but the Instructors page contains instructors. 응용 프로그램을 배포한 후 프로덕션 환경에서이 작업을 수행할 수 있습니다.This is what you will get in production after you deploy the application.

Empty_Students_page

Instructors_page_after_initial_migration

이제 프로젝트가 School 데이터베이스를 배포할 준비가 되었습니다.The project is now ready to deploy the School database.

배포용 멤버 자격 데이터베이스 만들기Creating a Membership Database for Deployment

Contoso 대학 응용 프로그램은 ASP.NET 멤버 자격 시스템 및 폼 인증을 사용 하 여 사용자를 인증 하 고 권한을 부여 합니다.The Contoso University application uses the ASP.NET membership system and forms authentication to authenticate and authorize users. 해당 페이지 중 하나는 관리자만 액세스할 수 있습니다.One of its pages is accessible only to administrators. 이 페이지를 표시 하려면 응용 프로그램을 실행 하 고 과정의 플라이 아웃 메뉴에서 크레딧 업데이트 를 선택 합니다.To see this page, run the application and select Update Credits from the flyout menu under Courses. 관리자 에게만 크레딧 업데이트 페이지를 사용할 수 있는 권한이 있으므로 응용 프로그램은 로그인 페이지를 표시 합니다.The application displays the Log In page, because only administrators are authorized to use the Update Credits page.

Log_in_pageLog_in_page

"Pas $ w0rd" 암호를 사용 하 여 "admin"으로 로그인 합니다 ("w0rd"에서 문자 "o" 대신 숫자 0).Log in as "admin" using the password "Pas$w0rd" (notice the number zero in place of the letter "o" in "w0rd"). 로그인 하면 크레딧을 업데이트 합니다. 페이지가 표시 됩니다.After you log in, the Update Credits page is displayed.

Update_Credits_pageUpdate_Credits_page

처음으로 사이트를 배포 하는 경우 테스트를 위해 만든 사용자 계정을 대부분 또는 모두 제외 하는 것이 일반적입니다.When you deploy a site for the first time, it is common to exclude most or all of the user accounts you create for testing. 이 경우 관리자 계정을 배포 하 고 사용자 계정을 배포 하지 않습니다.In this case, you'll deploy an administrator account and no user accounts. 테스트 계정을 수동으로 삭제 하는 대신 프로덕션에 필요한 관리자 사용자 계정이 하나뿐인 새 멤버 자격 데이터베이스를 만듭니다.Rather than manually deleting test accounts, you'll create a new membership database that has only the one administrator user account that you need in production.

Note

멤버 자격 데이터베이스는 계정 암호의 해시를 저장 합니다.The membership database stores a hash of account passwords. 한 컴퓨터에서 다른 컴퓨터로 계정을 배포 하려면 해싱 루틴이 원본 컴퓨터에서 수행 하는 것과 다른 해시를 대상 서버에서 생성 하지 않도록 해야 합니다.In order to deploy accounts from one machine to another, you must make sure that hashing routines don't generate different hashes on the destination server than they do on the source computer. 기본 알고리즘을 변경 하지 않는 한 ASP.NET Universal Providers 사용할 때 동일한 해시가 생성 됩니다.They will generate the same hashes when you use the ASP.NET Universal Providers, as long as you don't change the default algorithm. 기본 알고리즘은 HMACSHA256 이며 web.config 파일에 있는 machineKey 요소의 validation 특성에 지정 됩니다.The default algorithm is HMACSHA256 and is specified in the validation attribute of the machineKey element in the Web.config file.

멤버 자격 데이터베이스는 Code First 마이그레이션에 의해 유지 관리 되지 않으며, 테스트 계정 (School 데이터베이스의 경우)을 사용 하 여 데이터베이스를 시드 하는 자동 이니셜라이저가 없습니다.The membership database is not maintained by Code First Migrations, and there is no automatic initializer that seeds the database with test accounts (as there is for the School database). 따라서 테스트 데이터를 사용 가능 하 게 유지 하려면 새 테스트 데이터베이스를 만들기 전에 테스트 데이터베이스의 복사본을 만듭니다.Therefore, to keep test data available you'll make a copy of the test database before you create a new one.

솔루션 탐색기에서 App_Data 폴더에 있는 aspnet .sdf 파일의 이름을 aspnet-Dev로 바꿉니다.In Solution Explorer, rename the aspnet.sdf file in the App_Data folder to aspnet-Dev.sdf. 복사본을 만들지 말고 이름을 바꾸면 잠시 후 새 데이터베이스를 만듭니다.(Don't make a copy, just rename it — you'll create a new database in a moment.)

솔루션 탐색기에서 웹 프로젝트 (ContosoUniversity, not ContosoUniversity)가 선택 되어 있는지 확인 합니다.In Solution Explorer, make sure that the web project (ContosoUniversity, not ContosoUniversity.DAL) is selected. 그런 다음 프로젝트 메뉴에서 ASP.NET 구성 을 선택 하 여 웹 사이트 관리 도구(메커니즘)를 실행 합니다.Then in the Project menu, select ASP.NET Configuration to run the Web Site Administration Tool(WAT).

보안 탭을 선택합니다.Select the Security tab.

WAT_Security_tabWAT_Security_tab

역할 만들기 또는 관리 를 클릭 하 고 관리자 역할을 추가 합니다.Click Create or Manage Roles and add an Administrator role.

WAT_Create_New_RoleWAT_Create_New_Role

보안 탭으로 다시 이동 하 여 사용자 만들기를 클릭 하 고 관리자 권한으로 사용자 "관리자"를 추가 합니다.Navigate back to the Security tab, click Create User, and add user "admin" as an administrator. 사용자 만들기 페이지에서 사용자 만들기 단추를 클릭 하기 전에 관리자 확인란을 선택 했는지 확인 합니다.Before you click the Create User button on the Create User page, make sure that you select the Administrator check box. 이 자습서에 사용 된 암호는 "Pas $ w0rd" 이며 모든 전자 메일 주소를 입력할 수 있습니다.The password used in this tutorial is "Pas$w0rd", and you can enter any email address.

WAT_Create_UserWAT_Create_User

브라우저를 닫습니다.Close the browser. 솔루션 탐색기에서 새로 고침 단추를 클릭 하 여 새 aspnet .sdf 파일을 확인 합니다.In Solution Explorer, click the refresh button to see the new aspnet.sdf file.

New_aspnet.sdf_in_Solution_Explorer

Aspnet .sdf 를 마우스 오른쪽 단추로 클릭 하 고 프로젝트에 포함을 선택 합니다.Right-click aspnet.sdf and select Include in Project.

프로덕션 데이터베이스에서 개발 구분Distinguishing Development from Production Databases

이 섹션에서는 개발 버전이 School-Dev 및 aspnet-Dev이 고 프로덕션 버전이 School-Prod 및 aspnet-Prod이 되도록 데이터베이스의 이름을 바꿉니다.In this section, you'll rename the databases so that the development versions are School-Dev.sdf and aspnet-Dev.sdf and the production versions are School-Prod.sdf and aspnet-Prod.sdf. 이렇게 해야 하는 것은 아니지만, 이렇게 하면 테스트 및 프로덕션 버전의 데이터베이스를 혼동 하지 않도록 방지할 수 있습니다.This isn't necessary, but doing so will help keep you from getting test and production versions of the databases confused.

솔루션 탐색기에서 새로 고침 을 클릭 하 고 App_Data 폴더를 확장 하 여 이전에 만든 School 데이터베이스를 확인 합니다. 마우스 오른쪽 단추로 클릭 하 고 프로젝트에 포함을 선택 합니다.In Solution Explorer, click Refresh and expand the App_Data folder to see the School database that you created earlier; right-click it and select Include in project.

Including_School.sdf_in_project

Aspnet-Prod를 로 바꿉니다.Rename aspnet.sdf to aspnet-Prod.sdf.

학교의 이름을 School-Dev로 바꿉니다.Rename School.sdf to School-Dev.sdf.

Visual Studio에서 응용 프로그램을 실행할 때 -Prod 버전의 데이터베이스 파일을 사용 하지 않으려는 경우 -Dev 버전을 사용 하려고 합니다.When you run the application in Visual Studio you don't want to use the -Prod versions of the database files, you want to use -Dev versions. 따라서 데이터베이스의 Dev 버전을 가리키도록 web.config 파일에서 연결 문자열을 변경 해야 합니다.Therefore you have to change the connection strings in the Web.config file so that they point to the -Dev versions of the databases. School-Prod 파일을 만들지 않았습니다 .이 파일은 처음에 앱을 실행할 때 프로덕션 환경에서 해당 데이터베이스를 만들기 때문에 Code First.(You haven't created a School-Prod.sdf file, but that's OK because Code First will create that database in production the first time you run your app there.)

응용 프로그램 Web.config 파일을 열고 연결 문자열을 찾습니다.Open the application Web.config file, and locate the connection strings:

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

"Aspnet .sdf"를 "aspnet-Dev"로 변경 하 고 "School"을 "School-Dev"로 변경 합니다.Change "aspnet.sdf" to "aspnet-Dev.sdf", and change "School.sdf" to "School-Dev.sdf":

<configuration>
  <!-- Settings -->
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School-Dev.sdf" providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
  <!-- Settings -->
</configuration>

이제 SQL Server Compact 데이터베이스 엔진과 두 데이터베이스를 모두 배포할 준비가 되었습니다.The SQL Server Compact database engine and both databases are now ready to be deployed. 다음 자습서에서는 개발, 테스트 및 프로덕션 환경에서 달라 야 하는 설정에 대 한 자동 web.config 파일 변환을 설정 합니다.In the following tutorial you set up automatic Web.config file transformations for settings that must be different in the development, test, and production environments. 변경 해야 하는 설정 중에는 연결 문자열이 있지만 나중에 게시 프로필을 만들 때 이러한 변경 내용을 설정 합니다.(Among the settings that must be changed are the connection strings, but you'll set up those changes later when you create a publish profile.)

추가 정보More Information

NuGet에 대 한 자세한 내용은 nuget 및 Nuget을 사용 하 여 프로젝트 라이브러리 관리 설명서를 참조 하세요.For more information on NuGet, see Manage Project Libraries with NuGet and NuGet Documentation. NuGet을 사용 하지 않으려면 NuGet 패키지를 분석 하 여 설치 시 수행 되는 작업을 확인 하는 방법을 알아야 합니다.If you don't want to use NuGet, you'll need to learn how to analyze a NuGet package to determine what it does when it is installed. 예를 들어 web.config 변환을 구성 하 고 빌드 시에 실행 되도록 PowerShell 스크립트를 구성할 수 있습니다. NuGet의 작동 방식에 대 한 자세한 내용은 특히 패키지 만들기 및 게시구성 파일 및 소스 코드 변환을 참조 하세요.(For example, it might configure Web.config transformations, configure PowerShell scripts to run at build time, etc.) To learn more about how NuGet works, see especially Creating and Publishing a Package and Configuration File and Source Code Transformations.