Module 6 ยท BI Layer

Direct Lake Semantic Model + Power BI

Build a Direct Lake semantic model on the Bronze Lakehouse from Module 2 and spin up a 1-page Power BI report on top. No import, no DirectQuery overhead - Power BI reads your Delta files in OneLake directly, with live data freshness.

โฑ 30 minutes
๐ŸŽฏ Goal: live 1-page report
๐Ÿ›  Direct Lake ยท Power BI

Learning Objectives

Direct Lake Semantic Model + Power BI DIRECT LAKE

โ“˜
What is Direct Lake? A Power BI storage mode that reads Delta files in OneLake directly - no import, no DirectQuery overhead. You get import-mode performance with live data freshness, and the semantic model is just metadata pointing at your Lakehouse.
  1. Create the semantic model

    From lh_urbanpulse_bronze, click the New semantic model button at the top of the Tables view.

    In the picker, tick:

    • Hospitals
    • Wards
    • Staff
    • regions
    • facility_catalog

    Name it: sm_urbanpulse_cityops. Click Confirm.

    ๐Ÿ“ท
    SCREENSHOT NEEDED
    module-6/01-new-semantic-model.png
    New semantic model picker on lh_urbanpulse_bronze with Hospitals, Wards, Staff, regions, and facility_catalog ticked, and the model named sm_urbanpulse_cityops
  2. Define relationships

    Open the semantic model โ†’ Model view. Drag-and-drop to create:

    Relationships
    Wards[hospitalId]             โ”€โ”€*โ”€โ”€1โ”€โ”€ Hospitals[hospitalId]
    Staff[hospitalId]             โ”€โ”€*โ”€โ”€1โ”€โ”€ Hospitals[hospitalId]
    Hospitals[regionId]           โ”€โ”€*โ”€โ”€1โ”€โ”€ regions[regionId]
    facility_catalog[facility_id] โ”€โ”€1โ”€โ”€1โ”€โ”€ Hospitals[hospitalId]
  3. Add three measures

    In the model, right-click Hospitals โ†’ New measure. Repeat for each:

    DAX
    Total Beds = SUM(Hospitals[beds])
    
    ICU Capacity Ratio =
        DIVIDE(
            SUM(Hospitals[icuBeds]),
            SUM(Hospitals[beds]),
            0
        )
    
    Staff per Bed =
        DIVIDE(
            COUNTROWS(Staff),
            SUM(Hospitals[beds]),
            0
        )
  4. Auto-create the report

    Top of the semantic model โ†’ Create report โ†’ Auto-create. Power BI builds a starter page using your measures and dimensions.

  5. Polish the report

    Add whatever visuals fit your story - cards, bar charts, donuts, maps, slicers. The data, measures, and relationships are all in place. Save as rpt_urbanpulse_cityops.

    โœจ
    Let Copilot build it for you. In the report canvas, click the Copilot button on the top ribbon and ask things like "Create a page showing total beds, ICU capacity ratio by hospital, and staff count by region". Copilot generates the visuals, picks fields, and lays them out - then you tweak. The Direct Lake semantic model gives it the schema and measures it needs to ground responses.
  6. Validate Direct Lake mode

    In the semantic model settings, the Storage mode field for each table should read Direct Lake. If it shows DirectQuery instead, the capacity may not support Direct Lake - contact lab support.

Validation

  • Semantic model sm_urbanpulse_cityops exists in your workspace.
  • Four relationships are drawn in Model view.
  • All three DAX measures evaluate without errors.
  • Report rpt_urbanpulse_cityops has at least three visuals.
  • All tables report Direct Lake storage mode.

What You Just Built

๐Ÿ’ก
Why this matters for ISVs. Direct Lake lets you ship BI on top of your customer's Fabric data without designing a separate analytic database. Power BI is the analytic engine, and OneLake is the storage. Less infrastructure, faster time to insight.

Module 7 introduces a Fabric Ontology - a semantic graph over your data - so the Module 8 Data Agent can reason about Patients and Trains directly, not just rows and columns.

References