! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

Entity Framework Core를 사용하여 Dynamics 365 CRM을 .NET와 통합 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

Entity Framework Core를 사용하여 Dynamics 365 CRM을 .NET와 통합

페이지 정보

작성자 GrapeCity 작성일 2023-08-23 16:45 조회 390회 댓글 0건

본문

외부 응용 프로그램에서 CRM 외부의 Microsoft Dynamics 365 Sales 데이터에 엑섹스해야 하는 경우는 다양합니다.


보고 목적, 정보 대시보드 또는 데이터 처리 응용 프로그램과 통합을 위한 것일 수 있습니다.


ComponentOne은 ADO.NET, Entity Framework Core와 같은 유명한 데이터 액세스 기술을 사용하여, CRM 데이터에 액세스하고 업데이트할 수 있는 .NET Standard 기반 Dynamics 365 Sales 데이터 커넥터를 제공합니다.


이번 블로그에서는 Entity Framework Core를 사용하여 데이터에 액세스하는 방법과 LINQ에서 Dynamics 365 Sales 엔터티에 액세스하고 업데이트하는 방법에 대해 알아볼 것입니다.



ComponentOne 데이터 커넥터는 설치 프로그램의 서비스 구성 요소에 포함되어 있습니다.



Dynamics 365를 사용하여 외부 응용 프로그램 인증하기  


Dynamics 365는 CRM 데이터가 노출되는 공통 데이터 서비스에 액세스하기 위한 OAuth 인증을 지원합니다.


데이터에 대한 액세스를 허용하려면 Azure 활성 디렉터리에 앱을 등록해야 합니다.

튜토리얼을 참조하여 앱을 등록하고, OAuth 자격 증명을 얻어 보세요.


ComponentOne Dynamics 365 데이터 커넥터는 암호 자격 증명 및 클라이언트 자격 증명 부여 유형을 지원합니다.


문서에서 인증을 위해 두 가지 부여 유형을 모두 사용하는 방법에 대한 자세한 내용을 참조할 수 있습니다.


이번 블로그에서는 클라이언트 자격 증명 부여 유형을 사용하여 인증합니다.

따라서 다음과 같은 상세 정보를 미리 확보해야 합니다.


  1. OAuth Token Endpoint(OAuth 토큰 엔드포인트): 인증에 사용될 OAuth 2.0 토큰 엔드포인트

  2. OAuth Client Secret(OAuth 클라이언트 비밀번호): 인증에 사용될 OAuth 2.0 클라이언트의 비밀번호

  3. OAuth Client ID(OAuth 클라이언트 ID): 인증에 사용될 OAuth 2.0 클라이언트의 ID 클라이언트 식별자는 등록 프로세스 중에 클라이언트에게 지정됩니다.

  4. OAuth Extend Properties(OAuth 확장 속성): 라이브러리가 액세스 토큰을 올바르게 얻을 수 있도록 연결 문자열에 추가하려는 모든 사용자 지정 정보를 지원하도록 설계

  5. Dynamics 365 인스턴스 URL


다음으로, Entity Framework Core를 사용하여 데이터를 연결하고 액세스하는 방법을 보여 주기 위해 .NET Core 콘솔 응용 프로그램을 만듭니다.



ComponentOne 데이터 커넥터의 의존성 추가하기  

NuGet Gallery(nuget.org)의 C1.EntityFrameworkCore.D365 패키지를 프로젝트에 추가합니다.

Entity Framework Core를 사용하여 Dynamics 365 CRM을 .NET와 통합 


Dynamics 365 데이터베이스 컨텍스트 클래스 만들기 


이제 DbContext에 상속된 클래스를 추가합니다.


아래 코드 예에서는,

생성자OnConfiguring 메서드를 사용하여 'myD365CRM' 클래스를 만들었습니다.

public class Account
    {
        [Key]
        [Column("AccountId")]
        public Guid AccountId { get; set; }

        [Column("Name")]
        public string Name { get; set; }

        [Column("ExchangeRate")]
        public decimal? ExchangeRate { get; set; }

        [Column("ModifiedOn")]
        public DateTimeOffset ModifiedOn { get; set; }

        [Column("Address1_Composite")]
        public string Address1_Composite { get; set; }

        [Column("Description")]
        public string Description { get; set; }
    }



데이터 모델 추가하기   


액세스 또는 업데이트할 CRM 엔터티를 위한 클래스를 만들어야 합니다.


아래 코드에서는 Account 엔터티를 위한 모델 클래스를 만들었습니다.

public class Account
  {
      [Key]
      [Column("AccountId")]
       public Guid AccountId { get; set; }
​
      [Column("Name")]
       public string Name { get; set; }
​
      [Column("ExchangeRate")]
       public decimal? ExchangeRate { get; set; }
​
      [Column("ModifiedOn")]
       public DateTimeOffset ModifiedOn { get; set; }
​
      [Column("Address1_Composite")]
       public string Address1_Composite { get; set; }
​
      [Column("Description")]
       public string Description { get; set; }
  }



Microsoft Dynamics에 대한 연결 문자열 만들기  


CRM 서버로부터 받은 URL, ClientSecret, ClientID, TokenEndpoint 및 ExtendProperties를 사용하여 아래와 같이 연결 문자열을 구성할 수 있습니다.

const string urlDynamics = @"https://myD365CRM.api.crm8.dynamics.com/api/data/v9.1/";
const string ClientSecret = "password"
const string clientID = " 586e8e6f-7d54-4248-94a3-8257640737fa ";
const string tokenEnpoint = @"https://login.microsoftonline.com/common/oauth2/token";
const string extendProperties = @"{""resource"":""https://xxx.xxx.xxx.com/""}";
//Client credential in connection string
string connstr = $@"Url={urlDynamics};Use Etag=true;OAuth Client Id={clientID};OAuth Client Secret={cllentSecret};OAuth Token Endpoint={tokenEnpoint};OAuth Extend Properties={extendProperties};Max Page Size = 100";


데이터 커넥터는 성능 향상하기 위해 로컬로 데이터를 캐싱하는 것을 지원합니다.

연결을 통한 캐시 구성에 대한 자세한 내용은 문서를 참조해 주세요!



데이터 액세스 및 쿼리  


위에서 생성된 연결 문자열을 사용해 Main 메서드에서 myCRMDbContext의 새 인스턴스를 인스턴스화할 수 있습니다.


Dynamics 365 Sales 엔터티를 쿼리할 준비가 되었습니다.


LINQ를 사용하여 Adddress_Composite 필드에 'NewYork'이 포함된 모든 Account(계정)를 가지고 옵니다.


다음으로, 결과를 인쇄합니다.

var context = new myD365CRMContext(connstr)  
var records =  
               from p in context.Accounts  
               where p.Address1_Composite.Contains("NewYork")  
               select p;
​
           foreach (var account in records)  
          {  
               Console.WriteLine("{0} - {1} - {2} - {3} - {4}", account.AccountId, account.Name, account.Address1_Composite, account.ModifiedOn, account.Description);  
          }



데이터 업데이트  


ComponentOne 데이터 커넥터를 통해 레코드를 업데이트하는 방법은 Entity Framework와 유사합니다.


아래 코드에서는 먼저 AccountId를 기반으로 Account(계정) 레코드를 가져온 다음 해당 이름 속성을 'GrapeCity'로 설정합니다.


마지막으로 컨텍스트의 SaveChanges() 메서드를 호출합니다.

public void UpdateRecord()
      {
​
               var record = context.Accounts.Where(x => x. AccountId == "FA576e8e6f-7d54-4248-93a3-8257640737fa").FirstOrDefault();
​
               record.name = "GrapeCity";
context.SaveChanges();            
​
      }



데이터 삽입 및 삭제  


데이터 삽입은 간단합니다.

새 레코드를 데이터베이스 컨텍스트에 추가한 다음 SaveChanges 메서드를 호출하면 됩니다.

Account account = new Account();  
account.AccountId = new Guid();  
account.Name = "Contosso Inc";  
context.Add(account);
​
  //Save changes to database  
context.SaveChanges();


데이터 삭제 역시 간단합니다.

고유 키를 사용하여 레코드를 가져온 다음, Remove 메서드를 호출하여 삭제하고, 마지막으로 SaveChanges를 다시 호출하면 됩니다.

Account account = context.Accounts.Where(x => x. AccountId == "FA576e8e6f-7d54-4248-93a3-8257640737fa").FirstOrDefault();  
  context.Accounts.Remove(account);  
  //Save changes to database  
  context.SaveChanges();



LINQ와 ComponentOne 데이터 커넥터 함께 사용  


ComponentOne Dynamics 365 데이터 커넥터는 다양한 LINQ 쿼리를 지원합니다.

예를 들어, 'where'와 같은 필터 조건을 이미 확인했으며 'contains'를 사용하여 필터링도 적용할 수 있습니다.


또한 LINQ 쿼리는 'take'를 사용하여 지정된 수의 레코드 반환, 'orderby'를 사용하여 정렬, 'group'을 사용한 그룹화를 지원합니다.

데이터 커넥터는 또한 LINQ를 사용한 'join' 쿼리를 지원합니다.


공통 특성을 기반으로 여러 표에서 결과를 가져오는 예는 다음과 같습니다.

using (var context = new myD365CRMContext())
          {
               var results = (from p in context.invoices
                              join e in context.invoicedetails on p.invoiceid equals e._invoiceid_value
                              join f in context.products on e._productid_value equals f.productid
                              where p.name == "Test"
                              select new
                              {
                                  ID = p.invoiceid,
                                  Name = p.name,
                                  Invoicenumber = p.invoicenumber,
                                  Productname = e.productname,
                                  Productid_value = e._productid_value,
                                  Productnumber = f.productnumber
                              }).ToList();
​
          }


LINQ 쿼리에 대한 자세한 정보는 문서를 참조해 보세요!



데이터 커넥터를 사용에 대한 추가 샘플은 제품 설치 시 다음 위치에 설치됩니다. ~/Documents\ComponentOne Samples\Data Services\DataConnectors\CS


 



지금 바로 ComponentOne을 다운로드하여 직접 테스트해 보세요!

c1.png

  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.