OrganizationServiceContext 클래스 사용
게시 날짜: 2017년 1월
적용 대상: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Microsoft Dynamics 365(온라인 및 온-프레미스)에서 OrganizationServiceProxy 클래스를 사용하여 웹 서비스에 액세스할 수 있습니다. 또는 코드 생성 도구를 사용하여 생성된 OrganizationServiceContext를 사용하여 추가 기능에 대한 액세스를 얻을 수도 있습니다.OrganizationServiceContext 클래스를 사용하면 변경 내용을 추적하고, ID 및 관계를 관리하고, Microsoft Dynamics 365 LINQ 공급자에 대한 액세스를 제공합니다. 이 클래스에는 변경 내용을 컨텍스트가 추적하는 데이터에 전송하는 OrganizationServiceContext.SaveChanges 메서드도 포함합니다. 이 클래스는 WCF(Windows Communication Foundation) 데이터 서비스의 DataServiceContext 클래스와 같은 개념을 기반으로 합니다.
이 클래스를 생성하려면 초기 바인딩 유형을 생성할 때 /serviceContextName 매개 변수에 대한 값을 제공합니다. 코드 생성 도구는 이 이름을 생성된 클래스의 이름으로 사용합니다. 코드 생성 도구를 사용하는 방법에 대한 자세한 내용은 코드 생성 도구(CrmSvcUtil.exe)를 사용하여 초기 바인딩 엔터티 클래스 만들기을 참조하십시오. 응용 프로그램, 플러그 인 및 워크플로 활동을 개발하는 경우 조직 서비스 컨텍스트를 사용할 수 있습니다.
이 항목의 내용
OrganizationServiceContext 클래스 사용 방법
OrganizationServiceContext 클래스를 사용하여 변경 내용 추적
OrganizationServiceContext 클래스를 사용하여 관련 개체 추적
OrganizationServiceContext 클래스를 사용하여 변경 내용 저장
컨텍스트가 변경될 때 가상 메서드 사용
OrganizationServiceContext 클래스 사용 방법
컨텍스트 클래스를 인스턴스화하려면 클래스 생성자를 IOrganizationService 인터페이스를 구현하는 개체에 전달해야 합니다. 한 가지 옵션은 OrganizationServiceProxy 클래스의 인스턴스를 전달하는 것입니다.IOrganizationService 인터페이스에 대한 자세한 내용은 조직 서비스를 사용하여 데이터 또는 메타데이터 읽고 씁니다.을 참조하십시오.
다음 코드 예제에서는 컨텍스트 클래스의 새 인스턴스를 만드는 방법을 보여 줍니다. 이 예제에서 컨텍스트 클래스는 코드 생성 도구에서 /serviceContextName 매개 변수를 사용하는 이름을 지정하여 AdventureWorksCycleServiceContext라는 이름이 지정되었습니다.
//For early bound types to work correctly, they have to be enabled on the proxy.
_serviceProxy.EnableProxyTypes();
AdventureWorksCycleServiceContext context = new AdventureWorksCycleServiceContext(_serviceProxy);
조직 서비스 컨텍스트 개체를 만든 후 엔터티 만들기, 수정 또는 삭제를 추적하기 시작할 수 있습니다. 예를 들어 다음 코드 예제에서는 새 연락처를 인스턴스화한 후 서비스 컨텍스트 개체를 사용하여 Microsoft Dynamics 365 서버에 저장하는 방법을 보여 줍니다.
// Create a new contact record;
AdventureWorksCycleServiceContext context = new AdventureWorksCycleServiceContext (_serviceProxy);
Contact contact = new Contact()
{
FirstName = "Pamela",
LastName = "Brown",
Address1_Line1 = "123 Easy St.",
Address1_City = "Atlanta",
Address1_StateOrProvince = "GA",
Address1_PostalCode = "32254",
Telephone1 = "425-555-5678" };
context.AddObject(contact);
context.SaveChanges();
이전 코드 예제에서 주의해야 할 사항이 몇 가지 있습니다. 첫째, 새 연락처를 인스턴스화한 후 컨텍스트에서 개체를 추적할 수 있도록 연락처 개체를 OrganizationServiceContext.AddObject 메서드에 전달합니다. 주의할 두 번째 사항은 새 개체는 OrganizationServiceContext.SaveChanges 메서드를 사용하여 서버에 저장된다는 점입니다.
조직 서비스 컨텍스트는 Microsoft Dynamics 365에 전송하려는 엔터티 또는 관계를 추적해야 합니다. 예를 들어 LINQ 쿼리를 사용하여 레코드를 검색하고 컨텍스트에서 해당 엔터티를 추적하거나 OrganizationServiceContext.Attach 메서드를 사용하여 컨텍스트에서 엔터티를 추적하기 시작하도록 만듭니다. 클라이언트 응용 프로그램의 데이터를 사용하고 새 엔터티를 만들고, 관련 엔터티를 만들고, 기존 엔터티를 수정할 수 있지만 추적된 엔터티에서 SaveChanges 메서드를 호출하여 변경 내용을 Microsoft Dynamics 365 서버에 커밋해야 합니다.
OrganizationServiceContext 클래스를 사용하여 변경 내용 추적
컨텍스트에서 엔터티를 추적하는 방법을 결정하기 위해 엔터티 인스턴스에서 EntityState 속성을 확인할 수 있습니다. 다양한 메서드를 호출하거나 LINQ 쿼리를 사용하여 Microsoft Dynamics 365 에서 엔터티를 추적하도록 조직 서비스 컨텍스트에 알려야 합니다..NET LINQ(Language-Integrated Query) 쿼리에서 반환된 모든 엔터티는 서비스 컨텍스트에서 추적됩니다.
OrganizationServiceContext에서 다음 메서드 중 하나를 호출하여 개체를 서비스 컨텍스트에 추가할 수 있습니다.
방법 |
사용 |
---|---|
조직 서비스 컨텍스트에서 추적하는 엔터티 집합에 엔터티를 추가합니다. 컨텍스트에서 엔터티 상태는 Created로 설정됩니다.SaveChanges 메서드가 호출되면 이 레코드를 만들거나 서버에 추가합니다. |
|
조직 서비스 컨텍스트에서 추적하는 엔터티 집합에 엔터티를 추가합니다. 컨텍스트에서 엔터티 상태는 Unchanged로 설정됩니다.SaveChanges 메서드가 호출될 경우 상태가 변경되지 않으면 이 엔터티는 서버에 전송되지 않습니다. |
|
조직 서비스 컨텍스트에서 추적하는 엔터티 집합에 쿼리 결과를 추가합니다. |
OrganizationServiceContext 클래스를 사용하여 관련 개체 추적
Dynamics 365 및 Dynamics 365(온라인)에서 조직 서비스 컨텍스트를 사용하면 엔터티 간 관계를 만들고 업데이트할 수 있습니다.CrmSvcUtil 도구에서 생성되고 초기 바인딩 클래스에 있는 탐색 속성을 사용하여 관련 엔터티 속성 및 관계에 액세스하고 변경할 수 있습니다. 조직 서비스 컨텍스트는 서버에서 업데이트할 수 있도록 관련 엔터티에 대한 관련 엔터티를 추적해야 합니다.
OrganizationServiceContext에서 다음 메서드를 사용하여 관련 엔터티를 사용하고 엔터티를 서비스 컨텍스트에 추가합니다.
방법 |
사용 |
---|---|
컨텍스트에 대상을 추가합니다. 대상 엔터티에서 Attach 메서드를 호출한 후 원본 엔터티와 대상(관련) 엔터티 간에 AddLink 메서드를 호출합니다. |
|
추적할 컨텍스트에 관련 엔터티를 추가합니다. 컨텍스트에서 엔터티 상태는 Unchanged로 설정됩니다. |
|
원본과 대상 엔터티 간에 관계를 만듭니다. 컨텍스트에 대상을 추가합니다. 컨텍스트에서 대상 엔터티의 상태는 Created로 설정됩니다. |
|
지정된 관계에 대한 관련 엔터티 설정을 로드합니다. 탐색 속성을 사용하여 관련 엔터티에 대한 액세스를 제공합니다. 상위 엔터티에서 탐색 속성을 사용하여 엔터티에 액세스한 후 관련 엔터티에서 AddObject 메서드를 호출합니다. |
|
OrganizationServiceContext에서 지정된 엔터티의 상태를 Modified로 변경합니다. |
|
OrganizationServiceContext에서 삭제되는 지정된 엔터티의 상태를 변경합니다. |
탐색 속성을 사용하여 관련 엔터티를 로드합니다.
LoadProperty를 사용하여 검색할 때까지 LINQ를 사용하여 검색한 엔터티에 대한 관련 엔터티는 null이 됩니다. 다음 코드 샘플에서는 특정 연락처 레코드에 연결된 작업 레코드에 액세스하는 방법을 보여 줍니다.
Contact pam = context.ContactSet.Where(c => c.FirstName == "Pamela").FirstOrDefault();
if (pam != null)
{
// pam.Contact_Tasks is null until you use LoadProperty
context.LoadProperty(pam, "Contact_Tasks");
Task firstTask = pam.Contact_Tasks.FirstOrDefault();
}
OrganizationServiceContext 클래스를 사용하여 변경 내용 저장
조직 서비스 컨텍스트는 추적하는 엔터티 그래프를 보유합니다. 조직 서비스 컨텍스트에서 엔터티 변경 내용을 처리하고 서버에 전송하는 순서가 중요합니다. 기본 엔터티에 대한 업데이트가 처리된 후 관련 엔터티가 처리됩니다. 기본 엔터티에서 관련 엔터티로 값이 설정된 경우 서버에서 데이터를 업데이트할 때 해당 값이 사용됩니다.
엔터티 정보를 저장할 때 오류가 발생하면 메서드에 전달되는 SaveChangesOptions 매개 변수의 값에 관계 없이 SaveChangesResult가 포함된 새 예외 유형이 OrganizationServiceContext.SaveChanges 메서드에서 발생합니다.
컨텍스트가 변경될 때 가상 메서드 사용
OrganizationServiceContext의 변경 내용에 따라 작업을 수행해야 할 수도 있습니다. 이 작업을 활용하려면 작업을 차단하거나 작업에 대한 알림을 받을 수 있도록 가상 메서드가 제공되어야 합니다. 이러한 메서드를 활용하려면 OrganizationServiceContext에서 파생되거나 생성된 조직 서비스 컨텍스트를 변경해야 합니다. 다음 표에는 가상 메서드가 나와 있습니다.
방법 |
설명 |
---|---|
엔터티가 OrganizationServiceContext에 연결된 후 호출됩니다. |
|
링크가 OrganizationServiceContext에 연결된 후 호출됩니다. |
|
엔터티가 OrganizationServiceContext에서 분리된 후 호출됩니다. |
|
링크가 OrganizationServiceContext에서 분리된 후 호출됩니다. |
|
요청이 Microsoft Dynamics 365 Server에 제출된 직후에 호출됩니다. |
|
예외가 발생했는지 여부에 관계 없이 요청이 Microsoft Dynamics 365 Server에 제출된 직후에 호출됩니다. |
|
SaveChanges에 대한 호출 이후 작업이 발생하기 전에 호출됩니다. |
|
SaveChanges에 대한 호출에 대해 모든 작업이 완료되거나 오류가 있을 경우 호출됩니다. |
참고 항목
IOrganizationService
OrganizationServiceContext
코드에 초기 바인딩 엔터티 클래스 사용
샘플: 복합 LINQ 쿼리
코드 생성 도구(CrmSvcUtil.exe)를 사용하여 초기 바인딩 엔터티 클래스 만들기
만들기, 업데이트 및 삭제를 위해 초기 바인딩 엔터티 클래스 사용
Microsoft Dynamics 365
© 2017 Microsoft. All rights reserved. 저작권 정보