Connect Power Apps Code Apps to Dataverse (PAC CLI + CRUD)
A hands-on guide to connecting a Power Apps Code app to Microsoft Dataverse with the PAC CLI: prerequisites, authenticating your environment, adding a Dataverse table as a data source, the auto-generated service and model files, and full create, read, update, and delete examples.
A Power Apps Code app is a pro-code React app that runs on the Power Platform — and its real power shows when you connect it to Microsoft Dataverse, the secure, scalable data backbone of the platform. This guide walks the full flow: from prerequisites, to authenticating your environment with the PAC CLI, to adding a Dataverse table as a data source, to performing complete CRUD operations with the auto-generated service and model files.
What you need
Before you start, make sure you have:
- Power Apps client library — the
@microsoft/power-appsclient library for code apps installed in your project. - PAC CLI 1.46+ — Power Apps (Power Platform) CLI version 1.46 or later.
- Dataverse environment — an environment with Dataverse enabled, and you must be connected to it using the PAC CLI.
Step 1 — Connect your environment
First, connect to your Dataverse environment using the PAC CLI. Create an authentication profile, then select it:
pac auth create --url https://<your-environment-url>
pac auth select --url https://<your-environment-url>
Tip: make sure you have access to the Dataverse environment before you connect — the profile you select is the one all later commands use.
Step 2 — Add a data source
Add a Dataverse table as a data source in your Power Apps Code app so you can work with its tables and columns. You can do this in Power Apps Studio or straight from the CLI.
Option A — Power Apps Studio
- Open Power Apps Studio and go to Data → Add data.
- Search for Dataverse and select it.
- Choose the table(s) you want to use — for example Accounts and Contacts.
- Click Add to add the Dataverse table to your app.
Option B — PAC CLI command
Make sure you're connected to your environment, then run pac code add-data-source with the table's logical name:
pac code add-data-source -a dataverse -t <table-logical-name>
# Example
pac code add-data-source -a dataverse -t account
Replace <table-logical-name> with the logical name of the Dataverse table you want to connect to (for example account). The data source is added to your project and the generated files are created for you.
Step 3 — Generated files
When you add a data source, Power Apps automatically generates a model file and a service file and places them under src/generated/. For the built-in Accounts table you get:
- AccountsModel.ts — defines the data model (schema and types) for the Accounts table, in
src/generated/models/. - AccountsService.ts — provides the service methods for interacting with the Accounts data, in
src/generated/services/.
Import the service and model into your code like this:
import { AccountsService } from './generated/services/AccountsService';
import type { Accounts } from './generated/models/AccountsModel';
The service methods are static — you call AccountsService.create(...) directly, without instantiating the class. Every call returns a result object whose data property holds the record(s).
Step 4 — Create records
Build a record object from the generated model, then submit it with the service. Include only the fields you want to populate — exclude system-managed or read-only columns such as the primary key (accountid) and ownership fields.
const newAccount = {
name: "NextM365 Technologies",
accountnumber: "ACC001"
};
try {
const result = await AccountsService.create(newAccount as Omit<Accounts, 'accountid'>);
if (result.data) {
console.log('Account created:', result.data);
}
} catch (err) {
console.error('Failed to create account:', err);
}
Step 5 — Read data
Retrieve a single record by its primary key, or query for multiple records.
Retrieve a single record (by ID)
const accountId = "00000000-0000-0000-0000-000000000000"; // actual ID
try {
const result = await AccountsService.get(accountId);
if (result.data) {
console.log('Account retrieved:', result.data);
}
} catch (err) {
console.error('Failed to retrieve account:', err);
}
Retrieve multiple records
Use getAll(). It accepts optional query options (select, filter, orderBy, top, skip, maxPageSize) for delegation and paging:
const options = {
select: ['name', 'accountnumber', 'address1_city'],
filter: "address1_country eq 'USA'",
orderBy: ['name asc'],
top: 50
};
try {
const result = await AccountsService.getAll(options);
const accounts = result.data || [];
console.log(`Retrieved ${accounts.length} accounts`);
} catch (err) {
console.error('Failed to fetch accounts:', err);
}
Tip: always limit the columns you retrieve with select — smaller payloads mean faster responses.
Step 6 — Update records
To update, you need the record's primary key and the changes to apply. Send only the properties you're changing — including unchanged values can trigger business logic or corrupt audit data.
const accountId = "your-account-guid";
const changes = {
name: "Updated Account Name",
telephone1: "555-0123"
};
try {
await AccountsService.update(accountId, changes);
console.log('Account updated successfully');
} catch (err) {
console.error('Failed to update account:', err);
}
Best practice: send only the fields you want to update. This reduces errors and improves performance.
Step 7 — Delete records
Delete a record using its primary key (record ID):
const accountId = "00000000-0000-0000-0000-000000000000"; // actual ID
try {
await AccountsService.delete(accountId);
console.log('Account deleted successfully');
} catch (err) {
console.error('Failed to delete account:', err);
}
Important: make sure the record exists before deleting. Note that deleting Dataverse data sources through the PAC CLI is not yet supported.
You're all set — the full CRUD workflow
You can now perform complete CRUD operations seamlessly against Dataverse from your Power Apps Code app:
- Connect — connect your code app to Dataverse.
- Add source — add a Dataverse table as a data source.
- Use services — use the generated services and models.
- Create — create new records in Dataverse.
- Read — retrieve single or multiple records.
- Update — update existing records with ease.
- Delete — delete records using the record ID.
The bottom line
Power Apps Code Apps + Dataverse give you the power to build scalable, secure, and high-performance business applications — combining pro-code flexibility with a governed, enterprise-grade data platform.
Build smart. Automate more. Empower your business.
Keywords: Power Apps Code apps Dataverse, pac code add-data-source, PAC CLI Dataverse, generated service and model files, Dataverse CRUD TypeScript, create read update delete Dataverse, Power Platform pro-code, Power Apps client library, Microsoft 365.
Share this:
Frequently asked questions
What do I need to connect a Power Apps Code app to Dataverse?
PAC CLI version 1.46 or later, access to a Dataverse environment, and the Power Apps client library installed in your project.
How do I add a Dataverse table as a data source?
Use Power Apps Studio (Data > Add data > Dataverse) or run pac code add-data-source -a dataverse -t <table-logical-name> from the PAC CLI, using the table logical name such as account.
Where does the CRUD code come from?
Power Apps auto-generates a model file (AccountsModel.ts) and a service file (AccountsService.ts) under src/generated for each table you add. You call the static methods create, get, getAll, update, and delete on the generated service, and read results from result.data.
Learn Microsoft 365 with new tutorials every week
Subscribe on YouTube and follow on LinkedIn for hands-on Power Platform, SharePoint, Copilot Studio, and Microsoft 365 guides.
Related articles
- Power Apps Code — React Project Structure Explained (PAC CLI)A folder-by-folder, file-by-file tour of a Power Apps Code (React + Vite + TypeScript) project scaffolded by the PAC CLI. What .power, node_modules, public, src and generated are for, what App.tsx, main.tsx, package.json and power.config.json do, and which files to leave alone.
- What Is Microsoft Power Fx? The Low-Code Language of the Power PlatformA plain-English introduction to Microsoft Power Fx — the Excel-like, low-code language behind Power Apps and the wider Power Platform. What it is, why it "thinks spreadsheet", how declarative formulas auto-recalculate, the no-code to pro-code spectrum, its design principles, and where you use it.
- Connect Power Apps Code Apps to Any Data Source — Dataverse, Azure SQL, SharePoint, Copilot Studio & MoreA complete developer guide to connecting Power Apps Code apps to any data source: Dataverse, Azure SQL, SharePoint, Copilot Studio agents, table metadata and REST APIs. See how to add each data source with PAC CLI, what each supports, how to choose the right one, and Microsoft best practices.