자동 추적 엔터티 연습Self-Tracking Entities Walkthrough

중요

자동 추적 엔터티 템플릿을 더 이상 권장하지 않습니다.We no longer recommend using the self-tracking-entities template. 이 템플릿은 기존 애플리케이션을 지원하는 용도로만 제공될 것입니다.It will only continue to be available to support existing applications. 애플리케이션에서 연결이 끊긴 엔터티 그래프를 사용해야 하는 경우 커뮤니티에서 적극적으로 개발한 자동 추적 엔터티와 비슷한 기술인 추적 가능 엔터티 같은 다른 대안을 고려하거나 하위 수준 변경 내용 추적 API를 사용하여 사용자 지정 코드를 작성하는 방법을 고려해 보세요.If your application requires working with disconnected graphs of entities, consider other alternatives such as Trackable Entities, which is a technology similar to Self-Tracking-Entities that is more actively developed by the community, or writing custom code using the low-level change tracking APIs.

이 연습에서는 Windows Communication Foundation (WCF) 서비스에서 엔터티 그래프를 반환 하는 작업을 노출 하는 시나리오를 보여 줍니다.This walkthrough demonstrates the scenario in which a Windows Communication Foundation (WCF) service exposes an operation that returns an entity graph. 그런 다음 클라이언트 응용 프로그램은 해당 그래프를 조작 하 고 Entity Framework를 사용 하 여 업데이트의 유효성을 검사 하 고 데이터베이스에 저장 하는 서비스 작업에 수정 내용을 전송 합니다.Next, a client application manipulates that graph and submits the modifications to a service operation that validates and saves the updates to a database using Entity Framework.

이 연습을 완료 하기 전에 자동 추적 엔터티 페이지를 확인 해야 합니다.Before completing this walkthrough make sure you read the Self-Tracking Entities page.

이 연습에서는 다음 작업을 수행합니다.This walkthrough completes the following actions:

  • 액세스할 데이터베이스를 만듭니다.Creates a database to access.
  • 모델을 포함 하는 클래스 라이브러리를 만듭니다.Creates a class library that contains the model.
  • 자동 추적 엔터티 생성기 템플릿으로 바꿉니다.Swaps to the Self-Tracking Entity Generator template.
  • 엔터티 클래스를 개별 프로젝트로 이동 합니다.Moves the entity classes to a separate project.
  • 엔터티를 쿼리하고 저장 하는 작업을 노출 하는 WCF 서비스를 만듭니다.Creates a WCF service that exposes operations to query and save entities.
  • 서비스를 사용 하는 클라이언트 응용 프로그램 (콘솔 및 WPF)을 만듭니다.Creates client applications (Console and WPF) that consume the service.

이 연습에서는 Database First을 사용 하지만 동일한 기술이 Model First에 동일 하 게 적용 됩니다.We'll use Database First in this walkthrough but the same techniques apply equally to Model First.

필수 구성 요소Pre-Requisites

이 연습을 완료 하려면 최신 버전의 Visual Studio가 필요 합니다.To complete this walkthrough you will need a recent version of Visual Studio.

데이터베이스 만들기Create a Database

Visual Studio와 함께 설치 되는 데이터베이스 서버는 설치한 Visual Studio 버전에 따라 다릅니다.The database server that is installed with Visual Studio is different depending on the version of Visual Studio you have installed:

  • Visual Studio 2012을 사용 하는 경우 LocalDB 데이터베이스를 만듭니다.If you are using Visual Studio 2012 then you'll be creating a LocalDB database.
  • Visual Studio 2010을 사용 하는 경우 SQL Express 데이터베이스를 만듭니다.If you are using Visual Studio 2010 you'll be creating a SQL Express database.

계속 해 서 데이터베이스를 생성 해 보겠습니다.Let's go ahead and generate the database.

  • Visual Studio를 엽니다.Open Visual Studio
  • 보기- > 서버 탐색기View -> Server Explorer
  • 데이터 연결- > 연결 추가 ...를 마우스 오른쪽 단추로 클릭 합니다.Right click on Data Connections -> Add Connection…
  • 서버 탐색기 데이터베이스에 연결 하지 않은 경우 Microsoft SQL Server 를 데이터 원본으로 선택 해야 합니다.If you haven’t connected to a database from Server Explorer before you’ll need to select Microsoft SQL Server as the data source
  • 설치한 항목에 따라 LocalDB 또는 SQL Express에 연결Connect to either LocalDB or SQL Express, depending on which one you have installed
  • 데이터베이스 이름으로 STESample 을 입력 합니다.Enter STESample as the database name
  • 확인 을 선택 하 고 새 데이터베이스를 만들지 여부를 묻는 메시지가 표시 되 면 를 선택 합니다.Select OK and you will be asked if you want to create a new database, select Yes
  • 이제 새 데이터베이스가 서버 탐색기에 표시 됩니다.The new database will now appear in Server Explorer
  • Visual Studio 2012을 사용 하는 경우If you are using Visual Studio 2012
    • 서버 탐색기에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다.Right-click on the database in Server Explorer and select New Query
    • 다음 SQL을 새 쿼리에 복사한 다음 쿼리를 마우스 오른쪽 단추로 클릭 하 고 실행 을 선택 합니다.Copy the following SQL into the new query, then right-click on the query and select Execute
  • Visual Studio 2010을 사용 하는 경우If you are using Visual Studio 2010
    • 데이터- > transact-sql 편집기- > 새 쿼리 연결 을 선택 합니다.Select Data -> Transact SQL Editor -> New Query Connection...
    • 을 입력 합니다. \ SQLEXPRESS 를 서버 이름으로 선택 하 고 확인을 클릭 합니다.Enter .\SQLEXPRESS as the server name and click OK
    • 쿼리 편집기 위쪽의 드롭다운에서 STESample 데이터베이스를 선택 합니다.Select the STESample database from the drop down at the top of the query editor
    • 다음 SQL을 새 쿼리에 복사한 다음 쿼리를 마우스 오른쪽 단추로 클릭 하 고 Sql 실행 을 선택 합니다.Copy the following SQL into the new query, then right-click on the query and select Execute 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
    );

    SET IDENTITY_INSERT [dbo].[Blogs] ON
    INSERT INTO [dbo].[Blogs] ([BlogId], [Name], [Url]) VALUES (1, N'ADO.NET Blog', N'blogs.msdn.com/adonet')
    SET IDENTITY_INSERT [dbo].[Blogs] OFF
    INSERT INTO [dbo].[Posts] ([Title], [Content], [BlogId]) VALUES (N'Intro to EF', N'Interesting stuff...', 1)
    INSERT INTO [dbo].[Posts] ([Title], [Content], [BlogId]) VALUES (N'What is New', N'More interesting stuff...', 1)

모델 만들기Create the Model

먼저 모델을 배치할 프로젝트가 필요 합니다.First up, we need a project to put the model in.

  • 파일- > 새로 만들기- > 프로젝트 ...File -> New -> Project...
  • 왼쪽 창에서 **Visual C # ** 를 선택 하 고 클래스 라이브러리 를 선택 합니다.Select Visual C# from the left pane and then Class Library
  • 이름으로 STESample 를 입력 하 고 확인을 클릭 합니다.Enter STESample as the name and click OK

이제 EF Designer에서 간단한 모델을 만들어 데이터베이스에 액세스 합니다.Now we'll create a simple model in the EF Designer to access our database:

  • 프로젝트- > 새 항목 추가 ...Project -> Add New Item...
  • 왼쪽 창에서 데이터 를 선택 하 고 ADO.NET 를 선택 엔터티 데이터 모델Select Data from the left pane and then ADO.NET Entity Data Model
  • 이름으로 BloggingModel 를 입력 하 고 확인을 클릭 합니다.Enter BloggingModel as the name and click OK
  • 데이터베이스에서 생성 을 선택 하 고 다음 을 클릭 합니다.Select Generate from database and click Next
  • 이전 섹션에서 만든 데이터베이스에 대 한 연결 정보를 입력 합니다.Enter the connection information for the database that you created in the previous section
  • 연결 문자열 이름으로 BloggingContext 를 입력 하 고 다음 을 클릭 합니다.Enter BloggingContext as the name for the connection string and click Next
  • 테이블 옆의 확인란을 선택 하 고 마침 을 클릭 합니다.Check the box next to Tables and click Finish

붙여넣기 코드 생성으로 전환Swap to STE Code Generation

이제 기본 코드 생성을 사용 하지 않도록 설정 하 고 자동 추적 엔터티로 교환 해야 합니다.Now we need to disable the default code generation and swap to Self-Tracking Entities.

Visual Studio 2012을 사용 하는 경우If you are using Visual Studio 2012

  • 솔루션 탐색기 에서 BloggingModel 를 확장 하 고 BloggingModel.ttBloggingModel.Context.tt를 삭제 하 여 기본 코드 생성을 사용 하지 않도록 설정 합니다.Expand BloggingModel.edmx in Solution Explorer and delete the BloggingModel.tt and BloggingModel.Context.tt This will disable the default code generation
  • EF 디자이너 화면에서 빈 영역을 마우스 오른쪽 단추로 클릭 하 고 코드 생성 항목 추가 ...를 선택 합니다.Right-click an empty area on the EF Designer surface and select Add Code Generation Item...
  • 왼쪽 창에서 온라인 을 선택 하 고 붙여넣기 생성기 를 검색 합니다.Select Online from the left pane and search for STE Generator
  • C # #에 대 한 붙여넣기 생성기 를 선택 하 고 이름으로 STETemplate 를 입력 한 다음 추가 를 클릭 합니다.Select the STE Generator for C# template, enter STETemplate as the name and click Add
  • STETemplate.ttSTETemplate.Context.tt 파일은 BloggingModel 파일 아래에 중첩 되어 추가 됩니다.The STETemplate.tt and STETemplate.Context.tt files are added nested under the BloggingModel.edmx file

Visual Studio 2010을 사용 하는 경우If you are using Visual Studio 2010

  • EF 디자이너 화면에서 빈 영역을 마우스 오른쪽 단추로 클릭 하 고 코드 생성 항목 추가 ...를 선택 합니다.Right-click an empty area on the EF Designer surface and select Add Code Generation Item...
  • 왼쪽 창에서 코드 를 선택한 다음 자동 추적 엔터티 생성기를 ADO.NET .Select Code from the left pane and then ADO.NET Self-Tracking Entity Generator
  • 이름으로 STETemplate 를 입력 하 고 추가 를 클릭 합니다.Enter STETemplate as the name and click Add
  • STETemplate.ttSTETemplate.Context.tt 파일은 프로젝트에 직접 추가 됩니다.The STETemplate.tt and STETemplate.Context.tt files are added directly to your project

엔터티 형식을 개별 프로젝트로 이동Move Entity Types into Separate Project

자동 추적 엔터티를 사용 하려면 클라이언트 응용 프로그램에 모델에서 생성 된 엔터티 클래스에 대 한 액세스 권한이 있어야 합니다.To use Self-Tracking Entities our client application needs access to the entity classes generated from our model. 전체 모델을 클라이언트 응용 프로그램에 노출 하지 않으려는 경우 엔터티 클래스를 개별 프로젝트로 이동 하겠습니다.Because we don't want to expose the whole model to the client application we're going to move the entity classes into a separate project.

첫 번째 단계는 기존 프로젝트에서 엔터티 클래스를 생성 하는 것을 중지 하는 것입니다.The first step is to stop generating entity classes in the existing project:

  • 솔루션 탐색기 에서 STETemplate.tt 을 마우스 오른쪽 단추로 클릭 하 고 속성 을 선택 합니다.Right-click on STETemplate.tt in Solution Explorer and select Properties
  • 속성 창의 사용자 지정 도구 속성에서 texttemplatingfilegenerator 의 선택을 취소 합니다.In the Properties window clear TextTemplatingFileGenerator from the CustomTool property
  • 솔루션 탐색기 에서 STETemplate.tt 를 확장 하 고 그 아래 중첩 된 모든 파일을 삭제 합니다.Expand STETemplate.tt in Solution Explorer and delete all files nested under it

다음으로 새 프로젝트를 추가 하 고 여기에 엔터티 클래스를 생성 하겠습니다.Next, we are going to add a new project and generate the entity classes in it

  • 파일- > 프로젝트 추가 > ...File -> Add -> Project...

  • 왼쪽 창에서 **Visual C # ** 를 선택 하 고 클래스 라이브러리 를 선택 합니다.Select Visual C# from the left pane and then Class Library

  • 이름으로 STESample를 입력 하 고 확인을 클릭 합니다.Enter STESample.Entities as the name and click OK

  • 프로젝트- > 기존 항목 추가 ...Project -> Add Existing Item...

  • STESample 프로젝트 폴더로 이동 합니다.Navigate to the STESample project folder

  • 모든 파일을 보려면 선택 ** * 합니다. (. * )**Select to view All Files (*.*)

  • STETemplate.tt 파일 선택Select the STETemplate.tt file

  • 추가 단추 옆에 있는 드롭다운 화살표를 클릭 하 고 링크로 추가 를 선택 합니다.Click on the drop down arrow next to the Add button and select Add As Link

    연결 된 템플릿 추가

또한 컨텍스트와 동일한 네임 스페이스에서 엔터티 클래스가 생성 되도록 합니다.We're also going to make sure the entity classes get generated in the same namespace as the context. 이렇게 하면 응용 프로그램 전체에서 추가 해야 하는 using 문 수가 줄어듭니다.This just reduces the number of using statements we need to add throughout our application.

  • 솔루션 탐색기 에서 연결 된 STETemplate.tt 를 마우스 오른쪽 단추로 클릭 하 고 속성 을 선택 합니다.Right-click on the linked STETemplate.tt in Solution Explorer and select Properties
  • 속성 창에서 사용자 지정 도구 네임 스페이스STESample 로 설정 합니다.In the Properties window set Custom Tool Namespace to STESample

붙여넣기 템플릿에서 생성 된 코드에는 컴파일을 위해 system.object 에 대 한 참조가 필요 합니다.The code generated by the STE template will need a reference to System.Runtime.Serialization in order to compile. 이 라이브러리는 serialize 할 수 있는 엔터티 형식에서 사용 되는 WCF DataContractDataMember 특성에 필요 합니다.This library is needed for the WCF DataContract and DataMember attributes that are used on the serializable entity types.

  • 솔루션 탐색기 에서 STESample 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 참조 추가 ...를 선택 합니다.Right click on the STESample.Entities project in Solution Explorer and select Add Reference...
    • Visual Studio 2012에서- system.web 옆의 확인란을 선택 하 고 확인 을 클릭 합니다.In Visual Studio 2012 - check the box next to System.Runtime.Serialization and click OK
    • Visual Studio 2010에서, 선택 하 고 확인 을 클릭 합니다 .In Visual Studio 2010 - select System.Runtime.Serialization and click OK

마지막으로 컨텍스트를 포함 하는 프로젝트에는 엔터티 형식에 대 한 참조가 필요 합니다.Finally, the project with our context in it will need a reference to the entity types.

  • 솔루션 탐색기 에서 STESample 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 참조 추가 ...를 선택 합니다.Right click on the STESample project in Solution Explorer and select Add Reference...
    • Visual Studio 2012-왼쪽 창에서 솔루션 을 선택 하 고 STESample 옆에 있는 확인란을 선택 하 고 확인 을 클릭 합니다.In Visual Studio 2012 - select Solution from the left pane, check the box next to STESample.Entities and click OK
    • Visual Studio 2010- 프로젝트 탭을 선택 하 고 STESample를 선택한 다음 확인 을 클릭 합니다.In Visual Studio 2010 - select the Projects tab, select STESample.Entities and click OK

참고

엔터티 형식을 개별 프로젝트로 이동 하는 또 다른 옵션은 템플릿 파일을 기본 위치에서 연결 하는 대신 이동 하는 것입니다.Another option for moving the entity types to a separate project is to move the template file, rather than linking it from its default location. 이렇게 하려면 템플릿에서 inputFile 변수를 업데이트 하 여 edmx 파일 (이 예제 ** \ 에서는)에 대 한 상대 경로를 제공 해야 합니다. BloggingModel**).If you do this, you will need to update the inputFile variable in the template to provide the relative path to the edmx file (in this example that would be ..\BloggingModel.edmx).

WCF 서비스 만들기Create a WCF Service

이제 데이터를 노출 하는 WCF 서비스를 추가할 때 프로젝트를 만들어 시작 합니다.Now it's time to add a WCF Service to expose our data, we'll start by creating the project.

  • 파일- > 프로젝트 추가 > ...File -> Add -> Project...
  • 왼쪽 창에서 **Visual C # ** 를 선택 하 고 WCF 서비스 응용 프로그램 을 선택 합니다.Select Visual C# from the left pane and then WCF Service Application
  • 이름으로 STESample를 입력 하 고 확인을 클릭 합니다.Enter STESample.Service as the name and click OK
  • System.object 어셈블리에 참조를 추가 합니다 .Add a reference to the System.Data.Entity assembly
  • STESampleSTESample 프로젝트에 대 한 참조 추가Add a reference to the STESample and STESample.Entities projects

런타임에 발견 되도록 EF 연결 문자열을이 프로젝트에 복사 해야 합니다.We need to copy the EF connection string to this project so that it is found at runtime.

  •  **STESample **프로젝트에 대 한 App.Config 파일을 열고 connectionStrings 요소를 복사 합니다.Open the App.Config file for the **STESample **project and copy the connectionStrings element
  • ConnectionStrings 요소를 STESample 프로젝트에 있는 Web.Config 파일의 구성 요소에 대 한 자식 요소로 붙여넣습니다 .Paste the connectionStrings element as a child element of the configuration element of the Web.Config file in the STESample.Service project

이제 실제 서비스를 구현할 때입니다.Now it's time to implement the actual service.

  • IService1.cs 를 열고 내용을 다음 코드로 바꿉니다.Open IService1.cs and replace the contents with the following code
    using System.Collections.Generic;
    using System.ServiceModel;

    namespace STESample.Service
    {
        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            List<Blog> GetBlogs();

            [OperationContract]
            void UpdateBlog(Blog blog);
        }
    }
  • Service1을 열고 내용을 다음 코드로 바꿉니다 .Open Service1.svc and replace the contents with the following code
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;

    namespace STESample.Service
    {
        public class Service1 : IService1
        {
            /// <summary>
            /// Gets all the Blogs and related Posts.
            /// </summary>
            public List<Blog> GetBlogs()
            {
                using (BloggingContext context = new BloggingContext())
                {
                    return context.Blogs.Include("Posts").ToList();
                }
            }

            /// <summary>
            /// Updates Blog and its related Posts.
            /// </summary>
            public void UpdateBlog(Blog blog)
            {
                using (BloggingContext context = new BloggingContext())
                {
                    try
                    {
                        // TODO: Perform validation on the updated order before applying the changes.

                        // The ApplyChanges method examines the change tracking information
                        // contained in the graph of self-tracking entities to infer the set of operations
                        // that need to be performed to reflect the changes in the database.
                        context.Blogs.ApplyChanges(blog);
                        context.SaveChanges();

                    }
                    catch (UpdateException)
                    {
                        // To avoid propagating exception messages that contain sensitive data to the client tier
                        // calls to ApplyChanges and SaveChanges should be wrapped in exception handling code.
                        throw new InvalidOperationException("Failed to update. Try your request again.");
                    }
                }
            }        
        }
    }

콘솔 응용 프로그램에서 서비스 사용Consume the Service from a Console Application

서비스를 사용 하는 콘솔 응용 프로그램을 만들어 보겠습니다.Let's create a console application that uses our service.

  • 파일- > 새로 만들기- > 프로젝트 ...File -> New -> Project...
  • 왼쪽 창에서 **Visual C # ** 를 선택 하 고 콘솔 응용 프로그램 을 선택 합니다.Select Visual C# from the left pane and then Console Application
  • 이름으로 STESample. ConsoleTest 를 입력 하 고 확인 을 클릭 합니다.Enter STESample.ConsoleTest as the name and click OK
  • STESample 프로젝트에 대 한 참조 추가Add a reference to the STESample.Entities project

WCF 서비스에 대 한 서비스 참조가 필요 합니다.We need a service reference to our WCF service

  • 솔루션 탐색기 에서 STESample ConsoleTest 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 서비스 참조 추가 ... 를 선택 합니다.Right-click the STESample.ConsoleTest project in Solution Explorer and select Add Service Reference...
  • 검색 을 클릭 합니다.Click Discover
  • 네임 스페이스로 BloggingService 를 입력 하 고 확인을 클릭 합니다.Enter BloggingService as the namespace and click OK

이제 서비스를 사용 하는 코드를 작성할 수 있습니다.Now we can write some code to consume the service.

  • Program.cs 를 열고 내용을 다음 코드로 바꿉니다.Open Program.cs and replace the contents with the following code.
    using STESample.ConsoleTest.BloggingService;
    using System;
    using System.Linq;

    namespace STESample.ConsoleTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Print out the data before we change anything
                Console.WriteLine("Initial Data:");
                DisplayBlogsAndPosts();

                // Add a new Blog and some Posts
                AddBlogAndPost();
                Console.WriteLine("After Adding:");
                DisplayBlogsAndPosts();

                // Modify the Blog and one of its Posts
                UpdateBlogAndPost();
                Console.WriteLine("After Update:");
                DisplayBlogsAndPosts();

                // Delete the Blog and its Posts
                DeleteBlogAndPost();
                Console.WriteLine("After Delete:");
                DisplayBlogsAndPosts();

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }

            static void DisplayBlogsAndPosts()
            {
                using (var service = new Service1Client())
                {
                    // Get all Blogs (and Posts) from the service
                    // and print them to the console
                    var blogs = service.GetBlogs();
                    foreach (var blog in blogs)
                    {
                        Console.WriteLine(blog.Name);
                        foreach (var post in blog.Posts)
                        {
                            Console.WriteLine(" - {0}", post.Title);
                        }
                    }
                }

                Console.WriteLine();
                Console.WriteLine();
            }

            static void AddBlogAndPost()
            {
                using (var service = new Service1Client())
                {
                    // Create a new Blog with a couple of Posts
                    var newBlog = new Blog
                    {
                        Name = "The New Blog",
                        Posts =
                        {
                            new Post { Title = "Welcome to the new blog"},
                            new Post { Title = "What's new on the new blog"}
                        }
                    };

                    // Save the changes using the service
                    service.UpdateBlog(newBlog);
                }
            }

            static void UpdateBlogAndPost()
            {
                using (var service = new Service1Client())
                {
                    // Get all the Blogs
                    var blogs = service.GetBlogs();

                    // Use LINQ to Objects to find The New Blog
                    var blog = blogs.First(b => b.Name == "The New Blog");

                    // Update the Blogs name
                    blog.Name = "The Not-So-New Blog";

                    // Update one of the related posts
                    blog.Posts.First().Content = "Some interesting content...";

                    // Save the changes using the service
                    service.UpdateBlog(blog);
                }
            }

            static void DeleteBlogAndPost()
            {
                using (var service = new Service1Client())
                {
                    // Get all the Blogs
                    var blogs = service.GetBlogs();

                    // Use LINQ to Objects to find The Not-So-New Blog
                    var blog = blogs.First(b => b.Name == "The Not-So-New Blog");

                    // Mark all related Posts for deletion
                    // We need to call ToList because each Post will be removed from the
                    // Posts collection when we call MarkAsDeleted
                    foreach (var post in blog.Posts.ToList())
                    {
                        post.MarkAsDeleted();
                    }

                    // Mark the Blog for deletion
                    blog.MarkAsDeleted();

                    // Save the changes using the service
                    service.UpdateBlog(blog);
                }
            }
        }
    }

이제 애플리케이션을 실행하여 작동하는지 확인할 수 있습니다.You can now run the application to see it in action.

  • 솔루션 탐색기 에서 STESample ConsoleTest 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 디버그- > 새 인스턴스 시작 을 선택 합니다.Right-click the STESample.ConsoleTest project in Solution Explorer and select Debug -> Start new instance

응용 프로그램이 실행 되 면 다음과 같은 출력이 표시 됩니다.You'll see the following output when the application executes.

Initial Data:
ADO.NET Blog
- Intro to EF
- What is New

After Adding:
ADO.NET Blog
- Intro to EF
- What is New
The New Blog
- Welcome to the new blog
- What's new on the new blog

After Update:
ADO.NET Blog
- Intro to EF
- What is New
The Not-So-New Blog
- Welcome to the new blog
- What's new on the new blog

After Delete:
ADO.NET Blog
- Intro to EF
- What is New

Press any key to exit...

WPF 응용 프로그램에서 서비스 사용Consume the Service from a WPF Application

서비스를 사용 하는 WPF 응용 프로그램을 만들어 보겠습니다.Let's create a WPF application that uses our service.

  • 파일- > 새로 만들기- > 프로젝트 ...File -> New -> Project...
  • 왼쪽 창에서 **Visual C # ** 를 선택 하 고 WPF 응용 프로그램 을 선택 합니다.Select Visual C# from the left pane and then WPF Application
  • 이름으로 STESample. WPFTest 를 입력 하 고 확인 을 클릭 합니다.Enter STESample.WPFTest as the name and click OK
  • STESample 프로젝트에 대 한 참조 추가Add a reference to the STESample.Entities project

WCF 서비스에 대 한 서비스 참조가 필요 합니다.We need a service reference to our WCF service

  • 솔루션 탐색기 에서 STESample WPFTest 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 서비스 참조 추가 ... 를 선택 합니다.Right-click the STESample.WPFTest project in Solution Explorer and select Add Service Reference...
  • 검색 을 클릭 합니다.Click Discover
  • 네임 스페이스로 BloggingService 를 입력 하 고 확인을 클릭 합니다.Enter BloggingService as the namespace and click OK

이제 서비스를 사용 하는 코드를 작성할 수 있습니다.Now we can write some code to consume the service.

  • Mainwindow.xaml 를 열고 내용을 다음 코드로 바꿉니다.Open MainWindow.xaml and replace the contents with the following code.
    <Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:STESample="clr-namespace:STESample;assembly=STESample.Entities"
        mc:Ignorable="d" x:Class="STESample.WPFTest.MainWindow"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">

        <Window.Resources>
            <CollectionViewSource
                x:Key="blogViewSource"
                d:DesignSource="{d:DesignInstance {x:Type STESample:Blog}, CreateList=True}"/>
            <CollectionViewSource
                x:Key="blogPostsViewSource"
                Source="{Binding Posts, Source={StaticResource blogViewSource}}"/>
        </Window.Resources>

        <Grid DataContext="{StaticResource blogViewSource}">
            <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True"
                      ItemsSource="{Binding}" Margin="10,10,10,179">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding BlogId}" Header="Id" Width="Auto" IsReadOnly="True" />
                    <DataGridTextColumn Binding="{Binding Name}" Header="Name" Width="Auto"/>
                    <DataGridTextColumn Binding="{Binding Url}" Header="Url" Width="Auto"/>
                </DataGrid.Columns>
            </DataGrid>
            <DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True"
                      ItemsSource="{Binding Source={StaticResource blogPostsViewSource}}" Margin="10,145,10,38">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding PostId}" Header="Id" Width="Auto"  IsReadOnly="True"/>
                    <DataGridTextColumn Binding="{Binding Title}" Header="Title" Width="Auto"/>
                    <DataGridTextColumn Binding="{Binding Content}" Header="Content" Width="Auto"/>
                </DataGrid.Columns>
            </DataGrid>
            <Button Width="68" Height="23" HorizontalAlignment="Right" VerticalAlignment="Bottom"
                    Margin="0,0,10,10" Click="buttonSave_Click">Save</Button>
        </Grid>
    </Window>
  • Mainwindow.xaml (MainWindow.xaml.cs)에 대 한 코드를 열고 내용을 다음 코드로 바꿉니다.Open the code behind for MainWindow (MainWindow.xaml.cs) and replace the contents with the following code
    using STESample.WPFTest.BloggingService;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows;
    using System.Windows.Data;

    namespace STESample.WPFTest
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                using (var service = new Service1Client())
                {
                    // Find the view source for Blogs and populate it with all Blogs (and related Posts)
                    // from the Service. The default editing functionality of WPF will allow the objects
                    // to be manipulated on the screen.
                    var blogsViewSource = (CollectionViewSource)this.FindResource("blogViewSource");
                    blogsViewSource.Source = service.GetBlogs().ToList();
                }
            }

            private void buttonSave_Click(object sender, RoutedEventArgs e)
            {
                using (var service = new Service1Client())
                {
                    // Get the blogs that are bound to the screen
                    var blogsViewSource = (CollectionViewSource)this.FindResource("blogViewSource");
                    var blogs = (List<Blog>)blogsViewSource.Source;

                    // Save all Blogs and related Posts
                    foreach (var blog in blogs)
                    {
                        service.UpdateBlog(blog);
                    }

                    // Re-query for data to get database-generated keys etc.
                    blogsViewSource.Source = service.GetBlogs().ToList();
                }
            }
        }
    }

이제 애플리케이션을 실행하여 작동하는지 확인할 수 있습니다.You can now run the application to see it in action.

  • 솔루션 탐색기 에서 STESample WPFTest 프로젝트를 마우스 오른쪽 단추로 클릭 하 고 디버그- > 새 인스턴스 시작 을 선택 합니다.Right-click the STESample.WPFTest project in Solution Explorer and select Debug -> Start new instance
  • 화면을 사용 하 여 데이터를 조작 하 고 저장 단추를 사용 하 여 서비스를 통해 데이터를 저장할 수 있습니다.You can manipulate the data using the screen and save it via the service using the Save button

WPF 주 창