Memprogram model semantik Power BI dengan Model Objek Tabular (TOM)
Berlaku untuk: SQL Server 2016 dan yang lebih baru Analysis Services Azure Analysis Services Fabric/Power BI Premium
Artikel ini awalnya dibuat oleh Tim Penasihat Pelanggan (CAT) Power BI untuk Power BI Dev Camp, kumpulan sesi, artikel, dan video tentang pemrograman tingkat lanjut untuk Power BI.
Power BI Premium model semantik menyertakan titik akhir XMLA. Titik akhir signifikan bagi pengembang Power BI karena menyediakan API untuk berinteraksi dengan mesin Analysis Services yang berjalan di Layanan Power BI dan untuk memprogram secara langsung terhadap model Power BI. Semakin banyak profesional Power BI yang menemukan bahwa mereka dapat membuat, menampilkan, dan mengelola model Power BI dengan menggunakan alat yang sudah ada sebelumnya yang menggunakan protokol XMLA seperti SQL Server Management Studio, Editor Tabular, dan DAX Studio. Sebagai pengembang .NET, Anda sekarang dapat menulis kode C# di aplikasi .NET untuk membuat dan memodifikasi model langsung di Layanan Power BI.
Model Objek Tabular (TOM) adalah pustaka .NET yang menyediakan lapisan abstrak di atas titik akhir XMLA. Ini memungkinkan pengembang untuk menulis kode dalam hal model pemrograman intuitif yang mencakup kelas seperti Model, Tabel, Kolom, dan Pengukuran. Di balik layar, TOM menerjemahkan operasi baca dan tulis dalam kode Anda ke dalam permintaan HTTP yang dijalankan terhadap titik akhir XMLA.
Fokus artikel ini adalah mulai menggunakan TOM dan menunjukkan cara menulis kode C# yang diperlukan untuk membuat dan memodifikasi model saat berjalan di Layanan Power BI. Namun, TOM juga dapat digunakan dalam skenario yang tidak melibatkan titik akhir XMLA, seperti saat pemrograman terhadap model lokal yang berjalan di Power BI Desktop. Untuk mempelajari selengkapnya tentang menggunakan TOM dengan Power BI Desktop, lihat seri blog anggota Power BI CAT Phil Seamark, dan pastikan watch Cara memprogram himpunan data menggunakan video Model Objek Tabular (TOM) dari Power BI Dev Camp.
TOM mewakili API baru dan canggih untuk pengembang Power BI yang terpisah dan berbeda dari REST API Power BI. Meskipun ada beberapa tumpang tindih antara kedua API ini, masing-masing API ini mencakup sejumlah besar fungsionalitas yang tidak termasuk dalam yang lain. Selain itu, ada skenario yang mengharuskan pengembang untuk menggunakan kedua API bersama-sama untuk menerapkan solusi penuh.
Memulai Model Objek Tabular
Hal pertama yang perlu Anda dapatkan sebelum Anda dapat memprogram dengan TOM adalah URL untuk koneksi ruang kerja. URL koneksi ruang kerja mereferensikan ruang kerja tertentu dan digunakan untuk membuat string koneksi yang memungkinkan kode Anda tersambung ke ruang kerja Power BI dan model yang berjalan di dalamnya. Mulailah dengan menavigasi ke halaman Pengaturan ruang kerja Power BI yang berjalan dalam kapasitas khusus.
Catatan
Titik akhir XMLA didukung untuk model yang berjalan hanya dalam kapasitas khusus. Ini tidak tersedia untuk model yang berjalan dalam kapasitas bersama. Jika bekerja dengan model dalam Power BI Premium per kapasitas Pengguna, Anda dapat terhubung sebagai pengguna tetapi Anda tidak dapat terhubung sebagai perwakilan layanan.
Setelah Anda menavigasi ke tab Premium dari panel Pengaturan , salin URL Koneksi Ruang Kerja ke clipboard.
Langkah selanjutnya adalah membuat aplikasi .NET baru di mana Anda menulis kode C# yang diprogram menggunakan TOM. Anda dapat membuat aplikasi Web atau aplikasi Desktop menggunakan .NET 5, .NET Core 3.1, atau versi yang lebih lama di .NET Framework. Dalam artikel ini kami membuat aplikasi konsol C# sederhana menggunakan .NET 5 SDK.
Membuat aplikasi konsol baru
Mulailah dengan menggunakan .NET CLI untuk membuat aplikasi konsol baru.
dotnet new console --name`
Menambahkan paket NuGet Model Objek Tabular
Setelah membuat aplikasi konsol, tambahkan paket NuGet Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64 yang berisi Model Objek Tabular (TOM). Anda dapat menginstal paket dalam aplikasi .NET 5 dengan menggunakan .NET CLI berikut:
dotnet add package Microsoft.AnalysisServices.NetCore.retail.amd64
Menambahkan string koneksi
Ketika proyek Anda memiliki paket NuGet dengan pustaka TOM yang diinstal, Anda kemudian dapat membuat aplikasi Halo Dunia tradisional dengan TOM. Aplikasi terhubung ke ruang kerja Power BI dengan menggunakan URL Koneksi Ruang Kerja, lalu menghitung model di ruang kerja dan menampilkan namanya di jendela konsol.
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);
}
}
}
Dalam contoh ini, string koneksi berisi URL Koneksi Ruang Kerja tetapi tidak ada informasi tentang pengguna. Jika Anda menjalankan aplikasi konsol dengan kode ini, aplikasi akan mulai berjalan dan kemudian Anda akan diminta dengan jendela berbasis browser untuk masuk. Jika Anda masuk dengan akun pengguna yang memiliki izin untuk mengakses ruang kerja yang dirujuk oleh URL Koneksi Ruang Kerja, pustaka TOM dapat memperoleh token akses, menyambungkan ke Layanan Power BI, dan menghitung melalui model di ruang kerja.
Untuk mempelajari selengkapnya tentang menyambungkan melalui titik akhir XMLA, lihat Konektivitas model sematik dengan titik akhir XMLA - Menyambungkan ke ruang kerja Premium.
Mengautentikasi dengan nama pengguna dan kata sandi
Untuk skenario pengembangan dan pengujian di mana keamanan tidak sama pentingnya, Anda dapat mengkodekan nama pengguna dan kata sandi Anda secara permanen, menghilangkan kebutuhan untuk masuk secara interaktif setiap kali Anda menjalankan program untuk menguji kode Anda, seperti yang ditunjukkan dalam kode berikut:
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);
Mengautentikasi dengan perwakilan layanan
Juga cukup mudah untuk mengautentikasi sebagai perwakilan layanan alih-alih sebagai pengguna. Jika Anda telah membuat aplikasi Microsoft Entra dengan ID Aplikasi dan rahasia aplikasi, Anda dapat mengautentikasi kode untuk dijalankan sebagai perwakilan layanan untuk aplikasi Microsoft Entra dengan menggunakan sampel kode berikut:
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);
Untuk memprogram dengan TOM dan mengakses model sebagai perwakilan layanan, Anda harus mengonfigurasi pengaturan Power BI tingkat penyewa di portal Admin Power BI. Langkah-langkah untuk mengonfigurasi Power BI untuk mendukung menyambungkan sebagai perwakilan layanan dijelaskan dalam Menyematkan konten Power BI dengan perwakilan layanan dan rahasia aplikasi.
Mengautentikasi dengan token akses Microsoft Entra
TOM juga memberikan fleksibilitas saat membuat koneksi menggunakan token akses Microsoft Entra yang valid. Jika Anda memiliki keterampilan pengembang untuk menerapkan alur autentikasi dengan ID Microsoft Entra dan memperoleh token akses, Anda dapat memformat TOM Anda string koneksi tanpa nama pengguna, tetapi menyertakan token akses sebagai kata sandi sebagai gantinya, seperti yang ditunjukkan dalam sampel kode berikut:
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);
}
Jika Anda memperoleh token akses berbasis pengguna untuk menyambungkan ke ruang kerja Power BI dengan TOM, pastikan untuk meminta izin yang didelegasikan berikut saat memperoleh token akses untuk memastikan Anda memiliki semua izin penulisan yang Anda butuhkan:
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",
};
Jika Anda telah memprogram dengan Power BI REST API, Anda mungkin mengenali izin yang sudah dikenal seperti Content.Create, Dataset.ReadWrite.All dan Workspace.ReadWrite.All. Pengamatan yang menarik adalah bahwa TOM menggunakan sekumpulan izin yang didelegasikan yang sama dengan Power BI REST API yang ditentukan dalam cakupan ID sumber daya Microsoft Entra dari https://analysis.windows.net/powerbi/api
.
Fakta bahwa titik akhir XMLA dan Power BI REST API memiliki serangkaian izin yang didelegasikan yang sama memiliki manfaatnya. Token akses dapat digunakan secara bergantian antara TOM dan Power BI REST API. Setelah Anda memperoleh token akses untuk memanggil TOM untuk membuat model baru, Anda dapat menggunakan token akses yang sama untuk memanggil Power BI REST API untuk mengatur kredensial sumber data, seperti yang dijelaskan nanti di artikel ini.
Satu hal yang cenderung membingungkan programmer Power BI adalah bahwa perwakilan layanan tidak menggunakan izin yang didelegasikan. Sebagai gantinya, saat memprogram dengan TOM, Anda mengonfigurasi akses untuk perwakilan layanan dengan menambahkannya ke ruang kerja target sebagai anggota dalam peran Admin atau Anggota.
Memahami objek server, database, dan model
Model objek di TOM didasarkan pada hierarki dengan objek Server tingkat atas yang berisi kumpulan objek Database . Saat memprogram dengan TOM di Power BI, objek Server mewakili ruang kerja Power BI dan objek Database mewakili model Power BI.
Setiap Database berisi objek Model yang menyediakan akses baca/tulis ke model data. Model berisi koleksi untuk elemen model data termasuk DataSource, Table, Relationship, Perspective, Culture, dan Role.
Seperti yang ditunjukkan dalam kode Halo Dunia, setelah Anda memanggil server. Sambungkan, Anda dapat dengan mudah menemukan model apa yang ada di dalam ruang kerja Power BI dengan menghitung kumpulan Database objek Server seperti yang diperlihatkan dalam kode berikut:
foreach (Database database in server.Databases) {
Console.WriteLine(database.Name);
}
Anda juga bisa menggunakan metode GetByName yang diekspos oleh objek koleksi Database untuk mengakses model berdasarkan nama, seperti ini:
Database database = server.Databases.GetByName("Wingtip Sales");
Penting untuk membedakan antara objek Databasedan properti Model dalamnya. Anda dapat menggunakan properti objek Database untuk menemukan atribut model seperti Nama, ID, CompatibilityMode, dan CompatibilityLevel. Ada juga properti EstimatedSize yang memungkinkan untuk menemukan seberapa besar model telah tumbuh. Properti lain termasuk LastUpdate, LastProcessed, dan LastSchemaUpdate yang memungkinkan Anda menentukan kapan model yang mendasar terakhir di-refresh dan kapan skema model terakhir diperbarui.
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);
}
Meskipun objek Database memiliki propertinya sendiri, objek Model dalam dari objek Database yang memberi Anda kemampuan untuk membaca dan menulis ke model data yang mendasar model. Berikut adalah contoh sederhana pemrograman objek Model database untuk menghitung melalui koleksi Tabelnya dan menemukan tabel apa yang ada di dalamnya.
Dalam model objek TOM, setiap objek Tabel memiliki objek koleksi untuk partisinya. kolom, pengukuran, dan hierarki.
Setelah mengambil objek Model untuk Database, Anda bisa mengakses tabel tertentu berdasarkan nama dalam model dengan menggunakan metode Temukan koleksi Tabel . Berikut adalah contoh mengambil tabel bernama Penjualan, dan menemukan anggotanya dengan menghitung koleksi Kolom dan mengukur koleksi:
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);
}
Memodifikasi model dengan TOM
Di bagian di atas, Anda telah melihat cara mengakses objek Database dan objek Model-nya untuk memeriksa model data model yang berjalan di Layanan Power BI. Sekarang saatnya untuk memprogram pembaruan model pertama kami dengan TOM dengan menambahkan ukuran ke tabel.
Kapasitas yang Anda gunakan harus diaktifkan untuk baca-tulis XMLA. Secara default, pengaturan izin titik akhir XMLA diatur ke Baca, sehingga harus secara eksplisit diatur ke Baca Tulis oleh seseorang dengan izin Kapasitas Admin. Pengaturan ini dapat dilihat dan diperbarui di halaman Pengaturan kapasitas di portal Admin.
Ketika titik akhir XMLA telah dikonfigurasi untuk baca-tulis, Anda kemudian dapat menambahkan ukuran baru bernama Pendapatan Penjualan ke tabel Penjualan , seperti yang ditunjukkan dalam kode berikut:
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();
Mari kita lihat lebih dekat kode ini. Pertama, Anda membuat objek Pengukuran baru menggunakan operator baru C# dan menyediakan nilai untuk Nama, Ekspresi, dan FormatString. Anda kemudian menambahkan objek Pengukuran baru ke kumpulan Pengukuran objek Tabel target dengan memanggil metode Tambahkan . Terakhir, panggil metode SaveChanges objek Model untuk menulis perubahan Anda kembali ke model di Layanan Power BI.
Perlu diingat bahwa pembaruan pada model di-batch dalam memori hingga Anda memanggil SaveChanges. Bayangkan skenario di mana Anda ingin menyembunyikan setiap kolom dalam tabel. Anda dapat memulai dengan menulis perulangan foreach untuk menghitung semua objek Kolom untuk tabel dan mengatur properti IsHidden untuk setiap objek Kolom ke true. Setelah perulangan foreach selesai, Anda memiliki beberapa pembaruan kolom yang di-batch dalam memori. Tetapi ini adalah panggilan terakhir ke SaveChanges yang mendorong semua perubahan kembali ke Layanan Power BI dalam batch, seperti yang ditunjukkan di bawah ini:
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();
Katakanlah Anda ingin memperbarui properti FormatString untuk kolom yang sudah ada. Koleksi Kolom mengekspos metode Temukan untuk mengambil objek Kolom target. Setelah itu, ini hanya masalah pengaturan properti FormatString dan memanggil SaveChanges, seperti ini:
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();
Kemampuan TOM untuk secara dinamis menemukan apa yang ada di dalam model memberikan peluang untuk melakukan pembaruan secara generik dan menyapu. Bayangkan skenario di mana Anda mengelola model yang memiliki banyak tabel dan puluhan atau bahkan ratusan kolom berdasarkan jenis data DateTime . Anda dapat memperbarui properti FormatString untuk setiap kolom DateTime di seluruh model secara bersamaan dengan menggunakan yang berikut ini:
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();
Merefresh model dengan TOM
Sekarang mari kita lakukan operasi pemeliharaan model yang khas. Seperti yang Anda lihat dalam kode berikut, tidak terlalu rumit untuk memulai operasi refresh model dengan menggunakan TOM:
public static void RefreshDatabaseModel(string Name) {
Database database = server.Databases.GetByName(Name);
database.Model.RequestRefresh(RefreshType.DataOnly);
database.Model.SaveChanges();
}
Sama seperti refresh model manual dan terjadwal, refresh melalui titik akhir XMLA ditampilkan dalam riwayat Refresh, tetapi dengan label, Melalui Titik Akhir XMLA.
Catatan
Meskipun TOM menyediakan kemampuan untuk memulai operasi refresh, TOM tidak dapat mengatur kredensial sumber data untuk model Power BI. Untuk merefresh model dengan TOM, Anda harus terlebih dahulu mengatur kredensial sumber data dalam pengaturan model Semantik atau dengan menggunakan REST API Power BI.
Membuat dan mengkloning model
Bayangkan Anda memiliki persyaratan untuk membuat dan mengkloning model Power BI menggunakan kode yang ditulis dalam C#. Mari kita mulai dengan menulis fungsi yang dapat digunakan kembali bernama CreateDatabase yang membuat objek Database baru, seperti ini:
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;
}
Dalam contoh ini, kita akan mulai dengan menggunakan metode GetNewNamedari objek pengumpulan Database untuk memastikan nama model baru kita unik dalam ruang kerja target. Setelah itu, objek Database dan objek Modelnya dapat dibuat dengan menggunakan operator baru C# seperti yang ditunjukkan pada kode di bawah ini. Di akhir, metode ini menambahkan objek Database baru ke koleksi Database dan memanggil database. Perbarui metode.
Jika tujuan Anda adalah menyalin model yang sudah ada alih-alih membuat model baru, Anda bisa menggunakan metode CopyDatabase berikut untuk mengkloning model Power BI dengan membuat model kosong baru lalu memanggil CopyTo pada objek Model untuk model sumber guna menyalin seluruh model data ke dalam model yang baru dibuat.
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;
}
Membuat model dunia nyata dari awal
OK, sekarang bayangkan Anda baru saja membuat model baru dari awal dan sekarang Anda perlu menggunakan TOM untuk menyusun model data dunia nyata dengan menambahkan tabel, kolom, pengukuran, hierarki, dan hubungan tabel. Mari kita lihat contoh kode yang membuat tabel baru yang menyertakan kolom yang ditentukan, menambahkan hierarki dimensi tiga tingkat, dan bahkan menyediakan ekspresi M untuk kueri tabel yang mendasar:
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;
}
Setelah membuat sekumpulan metode pembantu untuk membuat tabel, Anda kemudian dapat menyusunnya bersama-sama untuk membuat model data, seperti ini:
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 mengekspos koleksi Hubungan pada objek Model yang memungkinkan Anda menentukan hubungan antara tabel dalam model Anda. Berikut adalah kode yang diperlukan untuk membuat objek SingleColumnRelationship yang menetapkan hubungan satu-ke-banyak antara tabel Produk dan tabel Penjualan :
model.Relationships.Add(new SingleColumnRelationship {
Name = "Products to Sales",
ToColumn = tableProducts.Columns["ProductId"],
ToCardinality = RelationshipEndCardinality.One,
FromColumn = tableSales.Columns["ProductId"],
FromCardinality = RelationshipEndCardinality.Many
});
Setelah Anda selesai menambahkan tabel dan hubungan tabel, simpan pekerjaan Anda dengan panggilan ke model. SaveChanges:
model.SaveChanges();
Pada titik ini, setelah memanggil SaveChanges, Anda akan dapat melihat model baru yang dibuat di Layanan Power BI dan mulai menggunakannya untuk membuat laporan baru.
Penting
Ingat, Anda harus menentukan kredensial sumber data dalam pengaturan model Semantik atau melalui Power BI REST API sebelum Anda dapat merefresh model.
Sampel proyek
Contoh proyek dengan kode C# yang telah Anda lihat dalam artikel ini tersedia di sini. Sekarang saatnya bagi Anda untuk mulai memprogram dengan TOM dan menemukan cara untuk memanfaatkan API baru yang kuat ini dalam pengembangan solusi kustom untuk Power BI.
Lihat juga
Konektivitas model semantik dengan titik akhir XMLA
Memecahkan masalah konektivitas titik akhir XMLA