ms-ai-architect/skills/ms-ai-engineering/references/data-engineering/dataverse-ai-integration.md
Kjell Tore Guttormsen 3a73eeafdc refactor(ms-ai-architect): R13 del 1 — nøytraliser Cosmo-personaen i ref-korpusets headinger, etter å ha rettet en gate som var målt usann to ganger
Ordre 20260912T193441Z-7358817909. Steg 1 var ikke transformen, men å rette
roadmapens R13-gate og få den ratifisert. Gaten `grep -rl "Cosmo"
skills/*/references -> 0` var usann på to uavhengige måter:

1. Ordren fanget den første: 451 av forekomstene er Azure Cosmos DB, ekte
   produktinnhold. Diskriminatoren er ikke bokstaven «s» — `Cosmos <norsk
   substantiv>` er genitiv av personaen (`### Cosmos tonalitet`), mens
   `Cosmos DB`/`CosmosClient`/`cosmos_ru` er produkt.
2. Denne økten fant den andre: 132 persona-forekomster ligger i prosa,
   tabeller, dialog-replikker og proveniens-linjer. Heading-nøytralisering
   kan ikke nå dem, så «0 persona» er uoppnåelig også under den ratifiserte
   formen. Operatøren ratifiserte alternativ A: gaten speiler formen, og de
   132 bokføres til R13b/R14.

Tre korreksjoner av premisser som sto i ordren og STATE:
  «ca 320 produkt»   -> 451 (case-sensitivt nett manglet 327 lowercase
                        TOC-ankre + 99 identifikatorer; sann nevner 1 638)
  «169 headinger»    -> 401. 169 var `^## For Cosmo`-prefikset (168) og var
                        internt inkonsistent med sin egen topp-variant (204)
  «417 matcher ingen
   populasjon»       -> 417 er cosmo-headinger utenfor kodefences; briefens
                        nevner var reell hele tiden

Fence-bevissthet er målt skadelig, ikke nødvendig: begge toggle-regler er
gale på dette korpuset (naiv toggle skjuler en ekte heading i
chain-of-thought-prompting.md, CommonMark-regelen ubalanserer
service-level-documentation-dr.md). Fence-agnostisk deteksjon finner 401
heading-linjer i nøyaktig de samme 40 variantene som fence-bevisst finner
400 i — ingen kodeblokk-linje er byte-identisk til en persona-heading. Derfor
nøkles transformen på 40 enumererte heading-tekster og ignorerer fences. En
ukjent variant kaster; en slug-kollisjon kaster. Ingenting auto-fikses.

TOC-en regenereres ikke, den rettes kirurgisk: alle 327 persona-lenker hadde
lenketekst lik én av de 40 heading-tekstene og anker lik slugify av den
(327/327, 0 avvik), så heading og TOC-entry skrives i samme operasjon og
ingen mellomtilstand etterlater en død lenke.

Ratifisert målform: `For Cosmo`, `For Cosmo Skyberg` og `For arkitekten
(Cosmo)` konvergerer på `For arkitekten`. To filer kolliderte og er adjudisert
ved å lese dem, ikke ved regel.

Verifisering (alle 7 kriterier fra ordren):
  G1 persona på heading-linjer   401 -> 0
  G2 døde fragmentlenker         1 -> 1 (pre-eksisterende, unntatt)
  G3 produkt-forekomster         451 -> 451; `Cosmos DB|Azure Cosmos` 308 = 308
  de 3 kun-produkt-filene        byte-identiske
  nettet validert begge veier    injisert persona feller G1; genitiv feller G1;
                                 produkt-heading og de 3 filene passerer
  hele diffen                    802 heading-linjer + 654 TOC-linjer, ANNET = 0
  linjeantall                    728 lagt til = 728 slettet
  suite                          1120/1120 (1097 + 23 nye)
  validate-plugin                250 PASS / 0 FAIL
  stikkprøve                     10 filer, alle 5 skills, inkl. de 3 mest
                                 produkt-tunge (26/20/19) — kun heading+TOC

Utenfor scope, urørt: de 4 SKILL.md, de 23 commands, CLAUDE.md, README.md,
NOTICE.md, docs/ (alt R14).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 22:12:28 +02:00

382 lines
18 KiB
Markdown

# Dataverse and AI Integration
**Last updated:** 2026-02
**Status:** GA
**Category:** Data Engineering for AI
**Type:** reference
**Source:** https://learn.microsoft.com/fabric/data-factory/connector-dataverse-overview
---
## Innhold
- [Introduksjon](#introduksjon)
- [Dataverse Connectors in Data Factory](#dataverse-connectors-in-data-factory)
- [Entity Relationship Mapping to Delta Tables](#entity-relationship-mapping-to-delta-tables)
- [Real-Time Dataverse Data Sync](#real-time-dataverse-data-sync)
- [Power Platform Data Integration](#power-platform-data-integration)
- [RLS Propagation from Dataverse to Fabric](#rls-propagation-from-dataverse-to-fabric)
- [Referanser](#referanser)
- [For arkitekten](#for-arkitekten)
## Introduksjon
Microsoft Dataverse er den sentrale dataplattformen for Power Platform og Dynamics 365, og inneholder forretningskritisk data fra CRM, ERP, og egendefinerte applikasjoner. Integrering av Dataverse-data med AI-losninger via Microsoft Fabric og Data Factory gjor det mulig a utnytte forretningsdata for prediktiv analyse, maskinlaring og intelligent automatisering uten komplekse ETL-pipelines.
For norsk offentlig sektor er Dataverse ofte kjernen i saksbehandlingssystemer, innbyggertjenester og Power Apps-baserte fagsystemer. Evnen til a koble disse dataene til AI-modeller -- for eksempel for prediktiv vedlikeholdsplanlegging, chatbot-trening, eller automatisert dokumentklassifisering -- representerer en viktig mulighetsdimensjon som krever god arkitekturforstaaelse.
Denne referansen dekker alle integrasjonsmonstre mellom Dataverse og AI-okosystemet, fra den direkte "Link to Fabric"-funksjonen til Data Factory-konnektorer, sanntidssynkronisering, og sikkerhetspropagering.
---
## Dataverse Connectors in Data Factory
### Dataverse Connector i Fabric Data Factory
Fabric Data Factory tilbyr en dedikert Dataverse-konnektor med flere integrasjonsmonstre:
| Kapabilitet | Gateway | Autentisering |
|---|---|---|
| **Dataflow Gen2** (kilde) | Ingen, On-prem, VNet | Org-konto, Service Principal, Workspace Identity |
| **Pipeline Copy Activity** (kilde/dest) | Ingen, On-prem, VNet | Org-konto, Service Principal, Workspace Identity |
| **Copy Job** (kilde/dest) | Ingen, On-prem, VNet | Org-konto, Service Principal, Workspace Identity |
### Copy Job modus
| Modus | Beskrivelse | Bruksomraade |
|---|---|---|
| **Full load** | Komplett kopi av alle rader | Forste gangs lasting |
| **Append** | Legg til nye rader | Inkrementell lasting |
| **Upsert** | Sett inn eller oppdater basert pa nokkel | Synkronisering |
### Pipeline-eksempel: Dataverse til Lakehouse
```json
{
"name": "DataverseToLakehouse",
"properties": {
"activities": [
{
"name": "CopyDataverseAccounts",
"type": "Copy",
"inputs": [{
"type": "DataverseEntity",
"entity": "account",
"filter": "modifiedon ge 2024-01-01"
}],
"outputs": [{
"type": "LakehouseTable",
"table": "bronze.crm_accounts"
}],
"typeProperties": {
"source": {
"type": "DataverseSource",
"query": "?$select=name,revenue,industry&$filter=statecode eq 0"
},
"sink": {
"type": "LakehouseSink",
"writeBehavior": "Upsert",
"upsertKeyColumns": ["accountid"]
}
}
}
]
}
}
```
---
## Entity Relationship Mapping to Delta Tables
### Dataverse-tabeller til Medallion Architecture
Dataverse bruker en relasjonell modell med entiteter, relasjoner og lookups. Ved overforig til Lakehouse bor dette mappes til Delta-tabeller i en medallion-arkitektur:
```
Dataverse Lakehouse
┌──────────────────┐ ┌──────────────────────┐
│ account │ ────────> │ bronze.crm_accounts │
│ contact │ ────────> │ bronze.crm_contacts │
│ opportunity │ ────────> │ bronze.crm_opps │
│ incident (case) │ ────────> │ bronze.crm_cases │
└──────────────────┘ └──────────┬───────────┘
Silver Layer (denormalisert)
┌──────────▼───────────┐
│ silver.customer_360 │
│ (account + contact + │
│ opportunity joined) │
└──────────┬───────────┘
Gold Layer (AI-klar)
┌──────────▼───────────┐
│ gold.churn_features │
│ gold.revenue_predict │
└──────────────────────┘
```
### Handtering av Dataverse-spesifikke datatyper
| Dataverse-type | Delta Lake-mapping | Merknad |
|---|---|---|
| **Lookup** | String (GUID) | Maa joines for visningsnavn |
| **OptionSet** | Integer + String label | Lagre baade verdi og label |
| **Money** | Decimal(38,4) | Inkluder valutareferanse |
| **DateTime** | Timestamp | Vurder tidssone (UTC vs lokal) |
| **Customer** | String (polymorf) | Kan peke til account eller contact |
| **PartyList** | Array of GUIDs | Flatten til separate rader |
### PySpark for entity-mapping
```python
from pyspark.sql.functions import col, when, lit
# Les Dataverse-data fra bronze
accounts = spark.read.format("delta").table("bronze.crm_accounts")
contacts = spark.read.format("delta").table("bronze.crm_contacts")
opportunities = spark.read.format("delta").table("bronze.crm_opps")
# Denormalisering: Customer 360 view
customer_360 = (
accounts
.join(
contacts,
accounts["accountid"] == contacts["parentcustomerid"],
"left"
)
.join(
opportunities
.groupBy("parentaccountid")
.agg(
F.sum("estimatedvalue").alias("total_pipeline"),
F.count("*").alias("opp_count"),
F.max("estimatedclosedate").alias("latest_opp_date")
),
accounts["accountid"] == col("parentaccountid"),
"left"
)
.select(
accounts["accountid"],
accounts["name"].alias("company_name"),
accounts["revenue"].alias("annual_revenue"),
accounts["industrycode"],
col("total_pipeline"),
col("opp_count"),
col("latest_opp_date")
)
)
# Skriv til silver layer
customer_360.write.format("delta").mode("overwrite").saveAsTable("silver.customer_360")
```
---
## Real-Time Dataverse Data Sync
### Link to Microsoft Fabric (Direct Link)
Den mest effektive metoden for Dataverse-Fabric-integrasjon er den innebygde "Link to Microsoft Fabric"-funksjonen:
```
Power Apps ──> "Analyze > Link to Microsoft Fabric"
┌──────────────────────────────┐
│ Fabric Workspace │
│ ├── Lakehouse │
│ │ ├── Shortcut: accounts │
│ │ ├── Shortcut: contacts │
│ │ └── Shortcut: cases │
│ ├── SQL Analytics Endpoint │
│ └── Default Semantic Model │
└──────────────────────────────┘
```
**Egenskaper:**
| Egenskap | Verdi |
|---|---|
| **Kopieringsmetode** | OneLake shortcuts (ingen dataduplisering) |
| **Format** | Delta Parquet |
| **Synkroniserings-latens** | Opptil 60 minutter |
| **Tabellvalg** | Alle tabeller med Track Changes, eller manuelt valg |
| **Autentisering** | Org-konto, Service Principal, Workspace Identity |
| **Read/Write** | Kun lesetilgang (shortcuts er read-only) |
### Dataverse Shortcuts via Fabric
Alternativt kan du opprette shortcuts direkte fra Fabric:
1. Apen Lakehouse i Fabric
2. Velg "New Table Shortcut" > "Dataverse"
3. Oppgi environment-URL
4. Bla gjennom og velg tabeller
```python
# Etter at shortcut er opprettet, les direkte i Notebook
df = spark.read.format("delta").table("accounts")
display(df.limit(10))
```
### Synkroniseringsmekanisme
Fabric Spark compute handterer synkronisering:
- **Initial load**: Full kopi av valgte tabeller
- **Inkrementell oppdatering**: Poller hvert 2. minutt for endringer
- **Endringssporing**: Basert pa Dataverse Track Changes-funksjonen
- **Sletting**: Fjerner rader nar kildedata slettes
---
## Power Platform Data Integration
### Arkitektur for AI-drevet Power Platform
```
┌──────────────────────────────────────────────────────────────────┐
│ Power Platform │
│ ┌──────────┐ ┌──────────────┐ ┌────────────────────────────┐ │
│ │ Power │ │ Power │ │ Copilot Studio │ │
│ │ Apps │ │ Automate │ │ (AI chatbot) │ │
│ └────┬─────┘ └──────┬───────┘ └──────────┬─────────────────┘ │
│ │ │ │ │
│ └───────────────┼──────────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Dataverse │ │
│ └────────┬────────┘ │
└───────────────────────┼──────────────────────────────────────────┘
│ Link to Fabric
┌────────▼────────────────────────────┐
│ Microsoft Fabric │
│ ┌──────────┐ ┌──────────────────┐ │
│ │ Lakehouse│ │ ML Models │ │
│ │ (Delta) │ │ (Spark/AzureML) │ │
│ └──────────┘ └──────────────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ Predictions │ │
│ │ (write back) │ │
│ └────────┬────────┘ │
└───────────────────────┼─────────────┘
Virtual Tables / Dataverse API
┌───────────────────────▼─────────────┐
│ Power Apps: vis AI-prediksjoner │
│ Power Automate: trigger pa insights │
└─────────────────────────────────────┘
```
### AI Builder-integrasjon
AI Builder-modeller lagrer resultater direkte i Dataverse:
| AI Builder-modell | Dataverse-lagring | Fabric-bruk |
|---|---|---|
| Prediction | Prediction-kolonne pa entitet | Feature for ML |
| Document Processing | Extracted fields | Treningsdata |
| Object Detection | Detection results | Analyse |
| Text Classification | Category labels | NLP-pipeline |
### Skrive AI-resultater tilbake til Dataverse
```python
# Via Dataverse Web API fra Fabric Notebook
import requests
def write_prediction_to_dataverse(env_url, access_token, entity, record_id, prediction):
"""Skriv AI-prediksjon tilbake til Dataverse-entitet."""
url = f"{env_url}/api/data/v9.2/{entity}({record_id})"
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
"OData-MaxVersion": "4.0"
}
payload = {
"cr_churn_prediction": prediction["score"],
"cr_prediction_date": prediction["timestamp"],
"cr_risk_category": prediction["category"]
}
response = requests.patch(url, json=payload, headers=headers)
return response.status_code
```
---
## RLS Propagation from Dataverse to Fabric
### Sikkerhetsmodell
Dataverse har et avansert sikkerhetssystem med Business Units, Security Roles, og Row-Level Security (RLS). Ved integrasjon med Fabric maa dette haandteres eksplisitt.
| Dataverse-sikkerhet | Fabric-ekvivalent | Automatisk propagering |
|---|---|---|
| **Business Units** | Workspace-tilgang | Nei -- manuell mapping |
| **Security Roles** | OneLake Security | Nei -- manuell mapping |
| **Row-Level Security** | RLS i SQL Endpoint / Semantic Model | Delvis |
| **Field-Level Security** | Column-level security | Nei |
| **Team-based access** | Workspace roles | Nei |
### Implementere RLS i Fabric
```sql
-- SQL Analytics Endpoint: Definer RLS
CREATE FUNCTION dbo.fn_security_predicate(@business_unit_id AS NVARCHAR(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT 1 AS result
WHERE @business_unit_id = SESSION_CONTEXT(N'business_unit_id');
-- Opprett sikkerhetspolicy
CREATE SECURITY POLICY crm_security
ADD FILTER PREDICATE dbo.fn_security_predicate(business_unit_id)
ON silver.customer_360
WITH (STATE = ON);
```
### Power BI Semantic Model RLS
```dax
// DAX-filter for RLS i Power BI
[BusinessUnitId] = USERPRINCIPALNAME()
// Eller via lookup-tabell:
CONTAINS(
FILTER(SecurityMapping, SecurityMapping[UserEmail] = USERPRINCIPALNAME()),
SecurityMapping[BusinessUnitId], [BusinessUnitId]
)
```
### Anbefalinger for sikkerhetspropagering
1. **Dokumenter mapping**: Opprett eksplisitt mapping mellom Dataverse Security Roles og Fabric Workspace Roles
2. **Automatiser med Power Automate**: Synkroniser rolletilordninger ved endringer
3. **Minimer direkte datatilgang**: Bruk Semantic Models med RLS som primaertilgang
4. **Auditing**: Aktiver Microsoft Purview for sporbarhet
---
## Referanser
- [Link your Dataverse environment to Microsoft Fabric](https://learn.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-view-in-fabric) -- Offisiell guide for Dataverse-Fabric-kobling
- [Dataverse connector overview (Fabric Data Factory)](https://learn.microsoft.com/en-us/fabric/data-factory/connector-dataverse-overview) -- Konnektorkapabiliteter
- [Create a Dataverse shortcut](https://learn.microsoft.com/en-us/fabric/onelake/create-dataverse-shortcut) -- Shortcut-oppretting fra Fabric
- [Fabric Link for Dataverse FAQ](https://learn.microsoft.com/en-us/power-apps/maker/data-platform/fabric-link-faq) -- Vanlige sporsmal og begrensninger
- [Link to Microsoft Fabric](https://learn.microsoft.com/en-us/power-apps/maker/data-platform/fabric-link-to-data-platform) -- Administrasjon av Fabric-kobling
- [Predictive data analysis using Dataverse, Fabric, and Azure AI services](https://learn.microsoft.com/en-us/power-platform/architecture/reference-architectures/ai-predictive-data-analysis) -- Referansearkitektur
- [Automation-centric data analytics with Fabric](https://learn.microsoft.com/en-us/power-automate/automation-analytics-with-fabric-introduction) -- Power Automate + Fabric
---
## For arkitekten
- **Bruk denne referansen** naar brukeren har Dynamics 365, Power Apps, eller Power Platform-data som skal brukes i AI-losninger, eller naar de trenger a skrive AI-prediksjoner tilbake til forretningsapplikasjoner.
- Anbefal **Link to Fabric** som forstevalg for enkel integrasjon -- ingen ETL, ingen ekstra infrastruktur, data forblir i Dataverse med shortcuts.
- Vaar oppmerksom pa **latens**: Link to Fabric har opptil 60 minutters forsinkelse. For sanntidsbehov, bruk Dataverse Web API eller Power Automate-triggers i stedet.
- For **sikkerhet**: Dataverse RLS propageres IKKE automatisk til Fabric. Dette maa alltid adresseres eksplisitt i arkitekturforslaget, spesielt for offentlig sektor med strenge tilgangskrav.
- Anbefal **medallion architecture** for Dataverse-data: Bronze (raa shortcut), Silver (denormalisert Customer 360), Gold (ML-features) for a unnga at AI-modeller trener pa denormaliserte Dataverse-strukturer.