# Dataverse and AI Integration

**Last updated:** 2026-02
**Status:** GA
**Category:** Data Engineering for AI

---

## 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 Cosmo

- **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.
