다음을 통해 공유


AdventureWorks 개체 모델 사용(EDM)

AdventureWorks 클라이언트 응용 프로그램에서 사용되는 아래 예제 코드는 EDM(엔터티 데이터 모델)의 여러 기능을 보여 줍니다. 앞서 AdventureWorks 모델 항목에서 설명한 스키마가 이 단원의 코드에 사용된 엔터티 및 연결에 대한 기본 스키마입니다.

스키마에서 디자인되고 저장소에 매핑된 형식은 프로그래밍 가능한 개체 모델로 구성됩니다. 이 모델의 데이터는 코드에 문자열로 포함되는 SQL 쿼리 없이 CLR(공용 언어 런타임) 구문을 사용하여 프로그래밍 가능합니다.

응용 프로그램 구성

개체 모델을 사용하려면 응용 프로그램 데이터가 저장된 데이터베이스에 연결해야 합니다. 스키마로 빌드한 DLL에서 제공하는 런타임 개체에 대한 엔터티 연결도 필요합니다.

exe.config 파일에는 SQL Server 데이터베이스에 연결하고 엔터티 연결을 설정하는 데 사용되는 연결 문자열이 들어 있습니다. 엔터티 연결이 설정되어 있으면 코드에서 이 개체 모델의 엔터티 및 연결에 액세스할 수 있습니다.

개발자가 exe.config 파일에 연결 문자열 텍스트를 추가해야 합니다.

providerName="System.Data.EntityClient" 할당에서는 이 단원의 다른 항목에서 소개한 스키마에 정의된 스키마와 매핑을 사용하는 엔터티 연결을 지정합니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
        <add name="AdventureworksContext" connectionString='Metadata=.;
            Provider=System.Data.SqlClient;
            Provider Connection String="server=.\sqlExpress;
            database=Adventureworks;
            Integrated Security=true;Connection Timeout=5;
            multipleactiveresultsets=true"'
            providerName="System.Data.EntityClient"/>
    </connectionStrings>
</configuration>
Note참고

이 연결 문자열은 같은 연결에 다른 데이터 판독기가 이미 열려 있는 경우 연결에서 Load 메서드를 호출하는 데 필요한 대로 MARS(Multiple Active Result Sets)를 true로 설정합니다.

AdventureWorks 엔터티 및 연결 사용

다음 코드에서는 이 AdventureWorks 단원의 다른 항목에서 설명한 스키마에 정의된 엔터티 및 연결을 기반으로 한 쿼리를 보여 줍니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdventureWorks;
using System.Data.Objects;
using System.Data.EntityClient;
using System.Data.Metadata.Edm;
using System.Collections.ObjectModel;


namespace AdventureworksClient
{
    class Program
    {
        static void Main(string[] args)
        {
            using (AdventureWorksContext objCtx = new AdventureWorksContext())
            {
                // find first 50 employees and display data.
                foreach (Employee employee in
                    objCtx.Employee.Where("it.EmployeeID < 50"))
                {
                    Console.WriteLine("EmployeeID: {0}",
                                              employee.EmployeeID);

                    // Find employee job candidate and print resume.
                    employee.JobCandidate.Load();
                    foreach (JobCandidate jc in employee.JobCandidate)
                        Console.WriteLine("\tJobCandidate: {0} \n\t{1}",
                            jc.JobCandidateID, jc.Resume);


                    // Find manager of employee and display.
                    if (null != employee.Employee2)
                    {
                        employee.Employee2.Employee2Reference.Load();
                        Console.WriteLine("Employee: {0} Manager: {1}",
                             employee.EmployeeID.ToString(),
                             employee.Employee2.EmployeeID.ToString());
                    }

                }

                // Employees IDs 1 - 290. 
                // Find first 50 with contact information.
                foreach (Contact contact in
                     objCtx.Contact.Where("it.ContactID < 50"))
                {
                    Console.WriteLine("Contact: {0} {1} {2}",
                        contact.ContactID, contact.FirstName,
                        contact.LastName);

                    foreach (EmployeeAddress emplAddress in
                                          objCtx.EmployeeAddress)
                    {
                        if (emplAddress.EmployeeID.Equals(contact.ContactID))
                        {
                            ObjectParameter param = new
                            ObjectParameter("p",
                                emplAddress.AddressID);
                            Address address =
                                objCtx.Address.Where(
                               "it.AddressID = @p",
                                param).First();

                            Console.WriteLine(
                              "\tEmployee address: {0}\n\t{1}\n\t{2}",
                              address.AddressLine1,
                              address.City, address.PostalCode);
                        }
                    }
                }

                // Find and display vendors.
                foreach (Vendor vendor in objCtx.Vendor)
                    Console.WriteLine("Vendor: {0}", vendor.Name);

                // Find and display store information.
                foreach (Store store in objCtx.Store)
                    Console.WriteLine("Store: {0}", store.Name);


                // Find and display product information.
                foreach (Product product in objCtx.Product)
                {
                    Console.WriteLine("Product Name: {0}", product.Name);
                    product.ProductModelReference.Load();
                    if (null != product.ProductModel)
                    {
                        Console.WriteLine("Model: {0}",
                            product.ProductModel.ProductModelID.ToString());
                    }
                }
            }

            try
            {
                // Establish a connection to the underlying data provider by 
                // using the connection string specified in the config file.
                using (EntityConnection connection =
                    new EntityConnection("Name=AdventureWorksContext"))
                {
                    // Open the connection.
                    connection.Open();

                    // Access the metadata workspace.
                    MetadataWorkspace workspace =
                       connection.GetMetadataWorkspace();

                    // To run DisplayProperties(workspace, DataSpace.CSpace);
                    // to display the extended properties in the conceptual model.
                    // see Extended Property (CSDL) (link under See Also).
                }
            }
            catch (System.Data.MetadataException exceptionMetadata)
            {
                Console.WriteLine("MetadataException: {0}",
                                exceptionMetadata.Message);
            }
            catch (System.Data.MappingException exceptionMapping)
            {
                Console.WriteLine("MappingException: {0}",
                                 exceptionMapping.Message);
            }

        }

        
    }
}

참고 항목

개념

Extended 속성(CSDL)

기타 리소스

EDM 사양
스키마 및 매핑 사양(Entity Framework)
샘플 응용 프로그램(Entity Framework)