TOM(테이블 형식 개체 모델)을 사용하여 Power BI 의미 체계 모델 프로그래밍

적용 대상: SQL Server 2016 이상 Analysis Services Azure Analysis Services Fabric/Power BI Premium

이 문서는 원래 Power BI용 고급 프로그래밍에 대한 세션, 문서 및 비디오 모음인 Power BI 개발자 캠프용 Power BI CAT(고객 자문 팀)에 의해 작성되었습니다.

Power BI Premium 의미 체계 모델에는 XMLA 엔드포인트가 포함됩니다. 엔드포인트는 Power BI 서비스에서 실행되는 Analysis Services 엔진과 상호 작용하고 Power BI 모델에 대해 직접 프로그래밍할 수 있는 API를 제공하기 때문에 Power BI 개발자에게 중요합니다. 점점 더 많은 Power BI 전문가가 SQL Server Management Studio, 테이블 형식 편집기 및 DAX Studio와 같은 XMLA 프로토콜을 사용하는 기존 도구를 사용하여 Power BI 모델을 만들고, 보고, 관리할 수 있다는 것을 알게 되었습니다. .NET 개발자는 이제 .NET 애플리케이션에서 C# 코드를 작성하여 Power BI 서비스에서 직접 모델을 만들고 수정할 수 있습니다.

TOM(테이블 형식 개체 모델)은 XMLA 엔드포인트 위에 추상 계층을 제공하는 .NET 라이브러리입니다. 이를 통해 개발자는 모델, 테이블, 및 측정값과 같은 클래스를 포함하는 직관적인 프로그래밍 모델의 관점에서 코드를 작성할 있습니다. 백그라운드에서 TOM은 코드의 읽기 및 쓰기 작업을 XMLA 엔드포인트에 대해 실행된 HTTP 요청으로 변환합니다.

XMLA 엔드포인트를 통해 모델링할 애플리케이션의 다이어그램

이 문서의 초점은 TOM을 시작하고 Power BI 서비스에서 실행되는 동안 모델을 만들고 수정하는 데 필요한 C# 코드를 작성하는 방법을 보여 줍니다. 그러나 TOM은 Power BI Desktop 실행되는 로컬 모델에 대해 프로그래밍하는 경우와 같이 XMLA 엔드포인트와 관련이 없는 시나리오에서도 사용할 수 있습니다. POWER BI DESKTOP TOM을 사용하는 방법에 대한 자세한 내용은 Power BI CAT 멤버 Phil Seamark의 블로그 시리즈를 참조하고 Power BI Dev Camp의 TOM(테이블 형식 개체 모델) 비디오를 사용하여 데이터 세트를 프로그래밍하는 방법을 watch.

TOM은 Power BI REST API와 별개인 Power BI 개발자를 위한 새롭고 강력한 API를 나타냅니다. 이러한 두 API 간에는 약간의 겹침이 있지만 이러한 API 각각에는 다른 API에 포함되지 않은 상당한 양의 기능이 포함되어 있습니다. 또한 개발자가 두 API를 함께 사용하여 전체 솔루션을 구현해야 하는 시나리오도 있습니다.

테이블 형식 개체 모델을 사용하여 시작

TOM을 사용하여 프로그래밍하기 전에 먼저 가져와야 하는 것은 작업 영역 연결의 URL입니다. 작업 영역 연결 URL은 특정 작업 영역을 참조하며 코드가 해당 Power BI 작업 영역 및 내부에서 실행되는 모델에 연결할 수 있는 연결 문자열 만드는 데 사용됩니다. 먼저 전용 용량에서 실행되는 Power BI 작업 영역의 설정 페이지로 이동합니다.

작업 영역 설정에 연결합니다.

참고

XMLA 엔드포인트는 전용 용량에서만 실행되는 모델에 대해 지원됩니다. 공유 용량에서 실행되는 모델에는 사용할 수 없습니다. 사용자 용량당 Power BI Premium 모델을 사용하는 경우 사용자로 연결할 수 있지만 서비스 주체로 연결할 수는 없습니다.

설정 창의 프리미엄 탭으로 이동한 후 작업 영역 연결 URL을 클립보드에 복사합니다.

의미 체계 모델 설정에서 작업 영역 연결 문자열.

다음 단계는 TOM을 사용하여 프로그래밍하는 C# 코드를 작성하는 새 .NET 애플리케이션을 만드는 것입니다. .NET Framework .NET 5, .NET Core 3.1 또는 이전 버전을 사용하여 웹 애플리케이션 또는 데스크톱 애플리케이션을 만들 수 있습니다. 이 문서에서는 .NET 5 SDK를 사용하여 간단한 C# 콘솔 애플리케이션을 만듭니다.

새 콘솔 애플리케이션 만들기

먼저 .NET CLI를 사용하여 새 콘솔 애플리케이션을 만듭니다.

dotnet new console --name`

테이블 형식 개체 모델 NuGet 패키지 추가

콘솔 애플리케이션을 만든 후 TOM(테이블 형식 개체 모델)이 포함된 Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 NuGet 패키지를 추가합니다. 다음 .NET CLI를 사용하여 .NET 5 애플리케이션에 패키지를 설치할 수 있습니다.

dotnet add package Microsoft.AnalysisServices.NetCore.retail.amd64

연결 문자열 추가

프로젝트에 TOM 라이브러리가 설치된 NuGet 패키지가 있는 경우 TOM을 사용하여 기존 헬로 월드 애플리케이션을 만들 수 있습니다. 애플리케이션은 작업 영역 연결 URL을 사용하여 Power BI 작업 영역에 연결한 다음 작업 영역의 모델을 열거하고 콘솔 창에 해당 이름을 표시합니다.

using System;
using Microsoft.AnalysisServices.Tabular;

class Program {
  static void Main() {

    // create the connect string
    string workspaceConnection = "powerbi://api.powerbi.com/v1.0/myorg/LearningTOM";
    string connectString = $"DataSource={workspaceConnection};";

    // connect to the Power BI workspace referenced in connect string
    Server server = new Server();
    server.Connect(connectString);

    // enumerate through models in workspace to display their names
    foreach (Database database in server.Databases) {
      Console.WriteLine(database.Name);
    }
  }
}

이 예제에서 연결 문자열 작업 영역 연결 URL을 포함하지만 사용자에 대한 정보는 포함하지 않습니다. 이 코드를 사용하여 콘솔 애플리케이션을 실행하는 경우 애플리케이션이 실행되기 시작한 다음, 로그인할 브라우저 기반 창이 표시됩니다. 작업 영역 연결 URL에서 참조하는 작업 영역에 액세스할 수 있는 권한이 있는 사용자 계정으로 로그인하는 경우 TOM 라이브러리는 액세스 토큰을 획득하고 Power BI 서비스에 연결하며 작업 영역의 모델을 열거할 수 있습니다.

XMLA 엔드포인트를 통해 연결하는 방법에 대한 자세한 내용은 XMLA 엔드포인트를 통한 Sematic 모델 연결 - 프리미엄 작업 영역에 연결을 참조하세요.

사용자 이름 및 암호를 사용하여 인증

보안이 중요하지 않은 개발 및 테스트 시나리오의 경우 다음 코드와 같이 프로그램을 실행하여 코드를 테스트할 때마다 대화형으로 로그인할 필요가 없도록 사용자 이름과 암호를 하드 코딩할 수 있습니다.

string workspaceConnection = "powerbi://api.powerbi.com/v1.0/myorg/YOUR_WORKSPACE";
string userId = "YOUR_USER_NAME";
string password = "YOUR_USER_PASSWORD";
string connectStringUser = $"DataSource={workspaceConnection};User ID={userId};Password={password};";
server.Connect(connectStringUser);

서비스 주체를 사용하여 인증

또한 사용자가 아닌 서비스 주체로 인증하는 것도 매우 쉽습니다. 애플리케이션 ID 및 애플리케이션 암호를 사용하여 Microsoft Entra 애플리케이션을 만든 경우 다음 코드 샘플을 사용하여 Microsoft Entra 애플리케이션의 서비스 주체로 실행되도록 코드를 인증할 수 있습니다.

string workspaceConnection = "powerbi://api.powerbi.com/v1.0/myorg/YOUR_WORKSPACE";
string tenantId = "YOUR_TENANT_ID";
string appId = "YOUR_APP_ID";
string appSecret = "YOUR_APP_SECRET";
string connectStringApp = $"DataSource={workspaceConnection};User ID=app:{appId}@{tenantId};Password={appSecret};";
server.Connect(connectStringApp);

TOM을 사용하여 프로그래밍하고 모델에 서비스 주체로 액세스하려면 Power BI 관리 포털에서 테넌트 수준 Power BI 설정을 구성해야 합니다. 서비스 주체로 연결을 지원하도록 Power BI를 구성하는 단계는 서비스 주체 및 애플리케이션 암호를 사용하여 Power BI 콘텐츠 포함에 설명되어 있습니다.

Microsoft Entra 액세스 토큰으로 인증

또한 TOM은 유효한 Microsoft Entra 액세스 토큰을 사용하여 연결을 설정할 때 유연성을 제공합니다. Microsoft Entra ID로 인증 흐름을 구현하고 액세스 토큰을 획득하는 개발자 기술이 있는 경우 다음 코드 샘플과 같이 사용자 이름 없이 TOM 연결 문자열 형식을 지정할 수 있지만 액세스 토큰을 암호로 대신 포함할 수 있습니다.

public static void ConnectToPowerBIAsUser() {
  string workspaceConnection = "powerbi://api.powerbi.com/v1.0/myorg/YOUR_WORKSPACE";
  string accessToken = TokenManager.GetAccessToken();  // you must implement GetAccessToken yourself
  string connectStringUser = $"DataSource={workspaceConnection};Password={accessToken};";
  server.Connect(connectStringUser);
}

TOM을 사용하여 Power BI 작업 영역에 연결하기 위해 사용자 기반 액세스 토큰을 획득하는 경우 액세스 토큰을 획득할 때 다음 위임된 권한을 요청하여 필요한 모든 작성 권한이 있는지 확인해야 합니다.

public static readonly string[] XmlaScopes = new string[] {
    "https://analysis.windows.net/powerbi/api/Content.Create",
    "https://analysis.windows.net/powerbi/api/Dataset.ReadWrite.All",
    "https://analysis.windows.net/powerbi/api/Workspace.ReadWrite.All",
};

Power BI REST API를 사용하여 프로그래밍한 경우 Content.Create, Dataset.ReadWrite.All 및 Workspace.ReadWrite.All과 같은 친숙한 권한을 인식할 수 있습니다. 흥미로운 관찰은 TOM이 의 Microsoft Entra 리소스 IDhttps://analysis.windows.net/powerbi/api의 scope 내에 정의된 Power BI REST API와 동일한 위임된 권한 집합을 사용한다는 것입니다.

XMLA 엔드포인트와 Power BI REST API가 모두 동일한 위임된 권한 집합을 공유한다는 사실에는 이점이 있습니다. 액세스 토큰은 TOM과 Power BI REST API 간에 서로 교환하여 사용할 수 있습니다. TOM을 호출하여 새 모델을 만드는 액세스 토큰을 획득한 후에는 이 문서의 뒷부분에 설명된 대로 동일한 액세스 토큰을 사용하여 Power BI REST API를 호출하여 데이터 원본 자격 증명을 설정할 수 있습니다.

Power BI 프로그래머를 혼동하는 경향이 있는 한 가지는 서비스 주체가 위임된 권한을 사용하지 않는다는 것입니다. 대신 TOM을 사용하여 프로그래밍할 때 대상 작업 영역에 관리 또는 멤버 역할의 멤버로 추가하여 서비스 주체에 대한 액세스를 구성합니다.

서버, 데이터베이스 및 모델 개체 이해

TOM의 개체 모델은 Database 개체의 컬렉션을 포함하는 최상위 Server 개체의 계층 구조를 기반으로 합니다. Power BI에서 TOM을 사용하여 프로그래밍할 때 Server 개체는 Power BI 작업 영역을 나타내고 Database 개체는 Power BI 모델을 나타냅니다.

모든 개체가 있는 테이블 형식 개체 모델 다이어그램

데이터베이스 에는 데이터 모델에 대한 읽기/쓰기 액세스를 제공하는 Model 개체가 포함되어 있습니다. 모델에DataSource, 테이블, 관계, 큐브 뷰, 문화권 및 역할을 비롯한 데이터 모델의 요소에 대한 컬렉션이 포함되어 있습니다.

헬로 월드 코드에 표시된 것처럼 서버를 호출하면 입니다. 다음 코드와 같이 Server 개체의 Databases 컬렉션을 열거하여 Power BI 작업 영역 내에 있는 모델을 쉽게 검색할 수 있습니다.

foreach (Database database in server.Databases) {
    Console.WriteLine(database.Name);
}

Databases 컬렉션 개체에서 노출하는 GetByName 메서드를 사용하여 다음과 같이 이름으로 모델에 액세스할 수도 있습니다.

Database database = server.Databases.GetByName("Wingtip Sales");

Database개체와 해당 내부 Model 속성을 구분하는 것이 중요합니다. Database 개체 속성을 사용하여 Name, ID, CompatibilityModeCompatibilityLevel과 같은 모델 특성을 검색할 수 있습니다. 모델이 얼마나 큰지 검색할 수 있는 EstimatedSize 속성도 있습니다. 다른 속성으로는 LastUpdate, LastProcessedLastSchemaUpdate 가 있습니다. 이 속성을 사용하면 기본 모델이 마지막으로 새로 고쳐진 시기와 모델 스키마가 마지막으로 업데이트된 시기를 확인할 수 있습니다.

public static void GetDatabaseInfo(string DatabaseName) {
  Database database = server.Databases.GetByName(DatabaseName);
  Console.WriteLine("Name: " + database.Name);
  Console.WriteLine("ID: " + database.ID);
  Console.WriteLine("CompatibilityMode: " + database.CompatibilityMode);
  Console.WriteLine("CompatibilityLevel: " + database.CompatibilityLevel);
  Console.WriteLine("EstimatedSize: " + database.EstimatedSize);
  Console.WriteLine("LastUpdated: " + database.LastUpdate);
  Console.WriteLine("LastProcessed: " + database.LastProcessed);
  Console.WriteLine("LastSchemaUpdate: " + database.LastSchemaUpdate);
}

Database 개체에는 자체 속성이 있지만 모델의 기본 데이터 모델을 읽고 쓸 수 있는 기능을 제공하는 Database 개체의 내부 Model 개체입니다. 다음은 Tables 컬렉션을 열거하고 내부에 있는 테이블을 검색하도록 데이터베이스 Model 개체를 프로그래밍하는 간단한 예제입니다.

TOM 개체 모델에서 각 Table 개체에는 파티션에 대한 컬렉션 개체가 있습니다. 열, 측정값 및 계층 구조.

테이블, 파티션, 열, 측정값 및 계층 구조가 있는 테이블 형식 개체 모델 다이어그램

Database에 대한 Model 개체를 검색한 후에는 Tables 컬렉션의 Find 메서드를 사용하여 모델의 이름으로 특정 테이블에 액세스할 수 있습니다. 다음은 Sales라는 테이블을 검색하고 Columns 컬렉션 및 Measures 컬렉션을 열거하여 해당 멤버를 검색하는 예제입니다.

Model databaseModel = server.Databases.GetByName("Tom Demo").Model;

Table tableSales = databaseModel.Tables.Find("Sales");

foreach (Column column in tableSales.Columns) {
  Console.WriteLine("Coulumn: " + column.Name);
}

foreach (Measure measure in tableSales.Measures) {
  Console.WriteLine("Measure: " + measure.Name);
  Console.WriteLine(measure.Expression);
}

TOM을 사용하여 모델 수정

위의 섹션에서는 Database 개체 및 해당 Model 개체에 액세스하여 Power BI 서비스에서 실행되는 모델의 데이터 모델을 검사하는 방법을 살펴보았습니다. 이제 테이블에 측정값을 추가하여 TOM으로 첫 번째 모델 업데이트를 프로그래밍할 차례입니다.

사용 중인 용량은 XMLA 읽기/쓰기에 사용하도록 설정해야 합니다. 기본적으로 XMLA 엔드포인트 권한 설정은 읽기로 설정되므로 용량 관리 권한이 있는 사용자가 명시적으로 읽기 쓰기로 설정해야 합니다. 이 설정은 관리 포털용량 설정 페이지에서 보고 업데이트할 수 있습니다.

관리 포털의 XMLA 읽기 쓰기 설정입니다.

XMLA 엔드포인트가 읽기/쓰기용으로 구성된 경우 다음 코드와 같이 Sales Revenue 라는 새 측정값을 Sales 테이블에 추가할 수 있습니다.

Model dataset = server.Databases.GetByName("Tom Demo Starter").Model;
Table tableSales = dataset.Tables.Find("Sales");
Measure salesRevenue = new Measure();
salesRevenue.Name = "Sales Revenue";
salesRevenue.Expression = "SUM(Sales[SalesAmount])";
salesRevenue.FormatString = "$#,##0.00";
tableSales.Measures.Add(salesRevenue);
dataset.SaveChanges();

이 코드를 좀 더 자세히 살펴보겠습니다. 먼저 C# 연산자를 사용하여 새 Measure 개체를 만들고 Name, ExpressionFormatString에 대한 값을 제공합니다. 그런 다음 Add 메서드를 호출하여 대상 Table 개체의 Measures 컬렉션에 새 Measure 개체를 추가합니다. 마지막으로 Model 개체의 SaveChanges 메서드를 호출하여 Power BI 서비스의 모델에 변경 내용을 다시 씁니다.

SaveChanges를 호출할 때까지 모델에 대한 업데이트는 메모리에 일괄 처리됩니다. 테이블의 모든 열을 숨기려는 시나리오를 상상해 보십시오. 먼저 foreach 루프를 작성하여 테이블의 모든 Column 개체를 열거하고 각 Column 개체의 IsHidden 속성을 true로 설정할 수 있습니다. foreach 루프가 완료되면 메모리에 일괄 처리되는 여러 열 업데이트가 있습니다. 그러나 아래와 같이 모든 변경 내용을 일괄 처리로 Power BI 서비스로 다시 푸시하는 SaveChanges 에 대한 마지막 호출입니다.

Model dataset = server.Databases.GetByName("Tom Demo").Model;
Table tableSales = dataset.Tables.Find("Sales");

foreach (Column column in tableSales.Columns) {
  column.IsHidden = true;
}

dataset.SaveChanges();

기존 열의 FormatString 속성을 업데이트한다고 가정해 보겠습니다. Columns 컬렉션은 대상 Column 개체를 검색하는 Find 메서드를 노출합니다. 그런 다음 FormatString 속성을 설정하고 SaveChanges를 호출하는 것은 다음과 같습니다.

Model dataset = server.Databases.GetByName("Tom Demo").Model;
Table tableSales = dataset.Tables.Find("Products");
Column columnListPrice = tableSales.Columns.Find("List Price");
columnListPrice.FormatString = "$#,##0.00";
dataset.SaveChanges();

모델 내부의 내용을 동적으로 검색하는 TOM의 기능은 일반적이고 포괄적인 방식으로 업데이트를 수행할 수 있는 기회를 제공합니다. DateTime 데이터 형식을 기반으로 많은 테이블과 수십 또는 수백 개의 열이 있는 모델을 관리하는 시나리오를 상상해 보십시오. 다음을 사용하여 전체 모델의 각 DateTime 열에 대한 FormatString 속성을 동시에 업데이트할 수 있습니다.

Database database = server.Databases.GetByName("Tom Demo Starter");
Model datasetModel = database.Model;

foreach (Table table in datasetModel.Tables) {
  foreach (Column column in table.Columns) {
    if(column.DataType == DataType.DateTime) {
      column.FormatString = "yyyy-MM-dd";
    }
  }
}

datasetModel.SaveChanges();

TOM을 사용하여 모델 새로 고침

이제 일반적인 모델 유지 관리 작업을 수행해 보겠습니다. 다음 코드에서 볼 수 있듯이 TOM을 사용하여 모델 새로 고침 작업을 시작하는 것은 그리 복잡하지 않습니다.

public static void RefreshDatabaseModel(string Name) {
  Database database = server.Databases.GetByName(Name);
  database.Model.RequestRefresh(RefreshType.DataOnly);
  database.Model.SaveChanges();
}

수동 및 예약된 모델 새로 고침과 마찬가지로 XMLA 엔드포인트를 통한 새로 고 침은 새로 고침 기록에 표시되지만 레이블은 XMLA 엔드포인트를 통해 표시됩니다.

기록 새로 고침 대화 상자

참고

TOM은 새로 고침 작업을 시작하는 기능을 제공하지만 Power BI 모델에 대한 데이터 원본 자격 증명 을 설정할 수 없습니다. TOM을 사용하여 모델을 새로 고치려면 먼저 의미 체계 모델 설정 또는 Power BI REST API를 사용하여 데이터 원본 자격 증명을 설정해야 합니다.

모델 만들기 및 복제

C#으로 작성된 코드를 사용하여 Power BI 모델을 만들고 복제해야 하는 요구 사항이 있다고 상상해 보십시오. 먼저 다음과 같이 새 Database 개체를 만드는 CreateDatabase라는 재사용 가능한 함수를 작성해 보겠습니다.

public static Database CreateDatabase(string DatabaseName) {

  string newDatabaseName = server.Databases.GetNewName(DatabaseName);
  var database = new Database() {
    Name = newDatabaseName,
    ID = newDatabaseName,
    CompatibilityLevel = 1520,
    StorageEngineUsed = Microsoft.AnalysisServices.StorageEngineUsed.TabularMetadata,
    Model = new Model() {
      Name = DatabaseName + "-Model",
      Description = "A Demo Tabular data model with 1520 compatibility level."
    }
  };

  server.Databases.Add(database);
  database.Update(Microsoft.AnalysisServices.UpdateOptions.ExpandFull);
  return database;

}

이 예제에서는 먼저 Databases 컬렉션 개체의 GetNewName메서드를 사용하여 새 모델 이름이 대상 작업 영역 내에서 고유하도록 합니다. 그런 다음 아래 코드와 같이 C# 연산자를 사용하여 Database 개체와 Model 개체를 만들 수 있습니다. 마지막에 이 메서드는 Databases 컬렉션에 새 Database 개체를 추가하고 데이터베이스를 호출합니다. Update 메서드.

새 모델을 만드는 대신 기존 모델을 복사하는 것이 목표인 경우 다음 CopyDatabase 메서드를 사용하여 새 빈 모델을 만든 다음 원본 모델의 Model 개체에서 CopyTo를 호출하여 Power BI 모델을 복제하여 전체 데이터 모델을 새로 만든 모델에 복사할 수 있습니다.

public static Database CopyDatabase(string sourceDatabaseName, string DatabaseName) {
  Database sourceDatabase = server.Databases.GetByName(sourceDatabaseName);
  string newDatabaseName = server.Databases.GetNewName(DatabaseName);
  Database targetDatabase = CreateDatabase(newDatabaseName);
  sourceDatabase.Model.CopyTo(targetDatabase.Model);
  targetDatabase.Model.SaveChanges();
  targetDatabase.Model.RequestRefresh(RefreshType.Full);
  targetDatabase.Model.SaveChanges();
  return targetDatabase;
}

처음부터 실제 모델 만들기

이제 처음부터 새 모델을 만들었으며 이제 TOM을 사용하여 테이블, 열, 측정값, 계층 구조 및 테이블 관계를 추가하여 실제 데이터 모델을 구성해야 한다고 상상해 보세요. 정의된 열을 포함하는 새 테이블을 만들고, 3단계 차원 계층 구조를 추가하고, 기본 테이블 쿼리에 대한 M 식을 제공하는 코드 예제를 살펴보겠습니다.

private static Table CreateProductsTable() {

  Table productsTable = new Table() {
    Name = "Products",
    Description = "Products table",
    Partitions = {
      new Partition() {
        Name = "All Products",
        Mode = ModeType.Import,
        Source = new MPartitionSource() {
          // M code for query maintained in separate source file
          Expression = Properties.Resources.ProductQuery_m
        }
      }
    },
    Columns = {
      new DataColumn() { Name = "ProductId", DataType = DataType.Int64, SourceColumn = "ProductId", IsHidden = true },
      new DataColumn() { Name = "Product", DataType = DataType.String, SourceColumn = "Product" },
      new DataColumn() { Name = "Description", DataType = DataType.String, SourceColumn = "Description" },
      new DataColumn() { Name = "Category", DataType = DataType.String, SourceColumn = "Category" },
      new DataColumn() { Name = "Subcategory", DataType = DataType.String, SourceColumn = "Subcategory" },
      new DataColumn() { Name = "Product Image", DataType = DataType.String, 
                        SourceColumn = "ProductImageUrl", DataCategory = "ImageUrl" }
     }
  };

  productsTable.Hierarchies.Add(
    new Hierarchy() {
      Name = "Product Category",
      Levels = {
        new Level() { Ordinal=0, Name="Category", Column=productsTable.Columns["Category"] },
        new Level() { Ordinal=1, Name="Subcategory", Column=productsTable.Columns["Subcategory"] },
        new Level() { Ordinal=2, Name="Product", Column=productsTable.Columns["Product"] }
      }
  });

  return productsTable;
}

테이블을 만드는 도우미 메서드 집합을 만든 후에는 테이블을 함께 작성하여 다음과 같이 데이터 모델을 만들 수 있습니다.

Model model = database.Model;
Table tableCustomers = CreateCustomersTable();
Table tableProducts = CreateProductsTable();
Table tableSales = CreateSalesTable();
Table tableCalendar = CreateCalendarTable();
model.Tables.Add(tableCustomers);
model.Tables.Add(tableProducts);
model.Tables.Add(tableSales);
model.Tables.Add(tableCalendar);

TOM은 모델 개체에 Relationships 컬렉션을 노출하여 모델의 테이블 간 관계를 정의할 수 있습니다. Products 테이블과 Sales 테이블 간에 일대다 관계를 설정하는 SingleColumnRelationship 개체를 만드는 데 필요한 코드는 다음과 같습니다.

model.Relationships.Add(new SingleColumnRelationship {
  Name = "Products to Sales",
  ToColumn = tableProducts.Columns["ProductId"],
  ToCardinality = RelationshipEndCardinality.One,
  FromColumn = tableSales.Columns["ProductId"],
  FromCardinality = RelationshipEndCardinality.Many
});

테이블 및 테이블 관계 추가가 완료되면 모델 호출을 사용하여 작업을 저장합니다 . SaveChanges:

model.SaveChanges();

이 시점에서 SaveChanges를 호출한 후 Power BI 서비스에서 만든 새 모델을 보고 새 보고서를 만드는 데 사용할 수 있어야 합니다.

Power BI 서비스 모델 보고서입니다.

중요

모델을 새로 고치려면 먼저 의미 체계 모델 설정 또는 Power BI REST API를 통해 데이터 원본 자격 증명을 지정해야 합니다.

샘플 프로젝트

이 문서에서 본 C# 코드가 포함된 샘플 프로젝트는 여기에서 사용할 수 있습니다. 이제 TOM을 사용하여 프로그래밍을 시작하고 Power BI용 사용자 지정 솔루션 개발에서 이 강력한 새 API를 활용하는 방법을 찾아야 합니다.

추가 정보

XMLA 엔드포인트를 사용하는 의미 체계 모델 연결
XMLA 엔드포인트 연결 문제 해결