$npx -y skills add microsoft/power-platform-skills --skill add-dataverseAdds Dataverse tables to a Power Apps code app with generated TypeScript models and services. Can also create new Dataverse tables. Use when connecting to Dataverse, adding tables, creating schema, or querying Dataverse data.
| 1 | **📋 Shared Instructions: [shared-instructions.md](${PLUGIN_ROOT}/shared/shared-instructions.md)** - Cross-cutting concerns. |
| 2 | |
| 3 | **References:** |
| 4 | |
| 5 | - [dataverse-reference.md](./references/dataverse-reference.md) - Picklist fields, virtual fields, lookups, file/image columns, form patterns (CRITICAL) |
| 6 | - [api-authentication-reference.md](./references/api-authentication-reference.md) - Dataverse API auth, token, publisher prefix |
| 7 | - [table-management-reference.md](./references/table-management-reference.md) - Query, create, extend tables and columns |
| 8 | - [data-architecture-reference.md](./references/data-architecture-reference.md) - Relationship types, dependency tiers |
| 9 | |
| 10 | # Add Dataverse |
| 11 | |
| 12 | Two paths: **existing tables** (skip to Step 5) or **new tables** (full workflow). |
| 13 | |
| 14 | ## Workflow |
| 15 | |
| 16 | 1. Plan → 2. Setup API Auth → 3. Review Existing Tables → 4. Create Tables → 5. Add Data Source → 6. Review Generated Files → 7. Build |
| 17 | |
| 18 | --- |
| 19 | |
| 20 | ### Step 1: Plan |
| 21 | |
| 22 | Check memory bank for project context. Ask the user: |
| 23 | |
| 24 | 1. Which Dataverse table(s) do they need? (e.g., `account`, `contact`, `cr123_customentity`) |
| 25 | 2. Do the tables **already exist** in their environment, or do they need to **create new** ones? |
| 26 | |
| 27 | **If tables already exist:** Skip to Step 5. |
| 28 | |
| 29 | **If creating new tables:** |
| 30 | |
| 31 | - Ask about the data they need and design an appropriate schema |
| 32 | - Use standard Dataverse tables when appropriate (`contact` for people, `account` for organizations) |
| 33 | - Build a dependency graph -- see [data-architecture-reference.md](./references/data-architecture-reference.md) for tier classification |
| 34 | - Enter plan mode with `EnterPlanMode`, present ER model with tables, columns, relationships, and creation order |
| 35 | - Get approval with `ExitPlanMode` |
| 36 | |
| 37 | ### Step 2: Setup API Auth (if creating tables) |
| 38 | |
| 39 | See [api-authentication-reference.md](./references/api-authentication-reference.md) for full details. |
| 40 | |
| 41 | ```powershell |
| 42 | az account show # Verify Azure CLI logged in |
| 43 | |
| 44 | # Find your Dataverse environment URL: |
| 45 | # In make.powerapps.com → Settings → Developer resources → Web API endpoint |
| 46 | # It looks like: https://<org-name>.crm.dynamics.com/api/data/v9.2/ |
| 47 | # Use the base URL: https://<org-name>.crm.dynamics.com |
| 48 | |
| 49 | $api = Initialize-DataverseApi -EnvironmentUrl "https://<org>.crm.dynamics.com" |
| 50 | $headers = $api.Headers |
| 51 | $baseUrl = $api.BaseUrl |
| 52 | $publisherPrefix = $api.PublisherPrefix |
| 53 | ``` |
| 54 | |
| 55 | Requires **System Administrator** or **System Customizer** security role. |
| 56 | |
| 57 | ### Step 3: Review Existing Tables (if creating tables) |
| 58 | |
| 59 | **Always query existing tables first before creating:** |
| 60 | |
| 61 | ```powershell |
| 62 | $existingTables = Invoke-RestMethod -Uri "$baseUrl/EntityDefinitions?`$filter=IsCustomEntity eq true&`$select=SchemaName,LogicalName,DisplayName" -Headers $headers |
| 63 | ``` |
| 64 | |
| 65 | See [table-management-reference.md](./references/table-management-reference.md) for `Find-SimilarTables`, `Compare-TableSchemas`, and `Build-TableNameMapping` functions. |
| 66 | |
| 67 | Present findings to user with `AskUserQuestion`: |
| 68 | |
| 69 | - Tables that can be **reused** (already exist with matching columns) |
| 70 | - Tables that need **extension** (exist but missing columns) |
| 71 | - Tables that must be **created** (no match found) |
| 72 | |
| 73 | ### Step 4: Create Tables (if creating tables) |
| 74 | |
| 75 | Get explicit confirmation before creating. Create in dependency order: |
| 76 | |
| 77 | - **Tier 0**: Reference tables (no dependencies) |
| 78 | - **Tier 1**: Primary entities (reference Tier 0) |
| 79 | - **Tier 2**: Dependent tables (reference Tier 1) |
| 80 | |
| 81 | Use safe functions from [table-management-reference.md](./references/table-management-reference.md): |
| 82 | |
| 83 | - `New-DataverseTableIfNotExists` |
| 84 | - `Add-DataverseColumnIfNotExists` |
| 85 | - `Add-DataverseLookupIfNotExists` (from [data-architecture-reference.md](./references/data-architecture-reference.md)) |
| 86 | |
| 87 | ### Step 5: Add Data Source |
| 88 | |
| 89 | For each table: |
| 90 | |
| 91 | ```bash |
| 92 | npx power-apps add-data-source -a dataverse -t <table-logical-name> |
| 93 | ``` |
| 94 | |
| 95 | Can add multiple tables by running the command for each one. |
| 96 | |
| 97 | ### Step 6: Review Generated Files |
| 98 | |
| 99 | The command generates: |
| 100 | |
| 101 | - `src/generated/models/{Table}Model.ts` -- TypeScript interfaces, plus `{Table}FileColumnName`, `{Table}ImageColumnName`, `{Table}UploadColumnName` union types if the table has file/image columns |
| 102 | - `src/generated/services/{Table}Service.ts` -- CRUD methods (create, get, getAll, update, delete) plus `upload`, `downloadFile`, `downloadImage`, `deleteFileOrImage` if file/image columns exist |
| 103 | |
| 104 | Show the user a usage example: |
| 105 | |
| 106 | ```typescript |
| 107 | import { AccountsService } from "../generated/services/AccountsService"; |
| 108 | |
| 109 | const result = await AccountsService.getAll({ |
| 110 | select: ["name", "accountnumber"], |
| 111 | filter: "statecode eq 0", |