Migrating to fabric: a 3 day plan for power bi teams
Teams often stare at microsoft fabric and get paralyzed by the size of it. "It's a whole new platform," they say. "We need a 6-month migration strategy."
You honestly don't.
Fabric is designed to be adopted incrementally. You can (and should) get your first end-to-end solution running in days, not months. The best way to learn is by shipping something real.
Here's the plan to take a slice of your existing power bi analytics and move it properly into fabric.
Day 1: foundation and ingestion
Your goal for day 1 is simple: get raw data into onelake. Don't worry about the report yet. Focus on the plumbing.
Morning: workspace and capacity setup
- Create a new workspace: Don't reuse an old one. Call it
[Project Name] - Dev. - Assign capacity: You need at least an F2 (or trial) capacity assigned to this workspace. Without capacity, it's just a power bi workspace.
- Create a lakehouse: Name it
lh_raw. This is your landing zone. - Create a second lakehouse: Name it
lh_gold. This is where your clean, modelled data will live.
Why two lakehouses? It separates "messy data we just ingested" from "clean data ready for reporting." It's a simplified medallion architecture (bronze/silver -> gold).
Afternoon: ingestion with dataflows gen2
Pick one data source. Just one. Ideally something you already know, like a sql database or a set of sharepoint files.
- Build a dataflow gen2: Connect to your source.
- Do minimal transformation: Just enough to get the data types right. Don't go crazy with business logic yet.
- Set destination: Point it to your
lh_rawlakehouse. - Publish and run: Watch the green checkmarks.
If you're stuck on dataflows, check out my dataflows gen2 guide.
Day 1 checkpoint: You have data sitting in delta tables in your lh_raw lakehouse. You can query it with sql.
Day 2: transformation and modeling
Now we turn raw data into a proper semantic model. This is where the "fabric magic" happens—specifically direct lake mode.
Morning: notebooks or stored procedures
You need to move data from lh_raw to lh_gold. You have two choices:
- Option A (low code): Use another dataflow gen2 to read from
lh_raw, apply business logic (renaming, merging, calculating), and write tolh_gold. - Option B (code): Use a spark notebook. Read from
lh_raw, do your transformations in pyspark or sql, and write tolh_gold.
If you're comfortable with python/sql, use notebooks. They are faster and cheaper at scale. If you are strictly power bi, dataflows are fine for starting out.
See my post on spark optimization if you go the notebook route.
Afternoon: the sql endpoint
Open your lh_gold lakehouse. Switch to the sql analytics endpoint view.
- Verify relationships: You can actually define primary/foreign keys here. They aren't enforced, but they help the semantic model.
- Write a test query: Make sure your data looks right.
SELECT TOP 100 * FROM my_table.
Day 2 checkpoint: You have clean, star-schema friendly tables in lh_gold.
Day 3: serving and consumption
This is the payoff. We're going to build a report that connects directly to onelake without importing data.
Morning: the direct lake semantic model
- From your
lh_goldlakehouse, click "New semantic model". - Select the tables you want (Fact and Dimensions).
- Define relationships: Drag and drop just like in power bi desktop.
- Write DAX: Yes, you still write DAX. Create your
Sum(Sales)andYTDmeasures here.
This model is in direct lake mode. It's not directquery (slow), and it's not import (stale). It reads delta files directly from storage. It is blazingly fast.
Afternoon: the report
- Open power bi desktop.
- Connect to onelake data hub.
- Select your new semantic model.
- Build the report.
Notice something? It feels exactly like building a normal power bi report. But there is no refresh schedule to manage for the dataset. When the lakehouse updates, the report updates.
Evening: deployment
Publish your report to the workspace. Share it with a few friendly users.
Day 3 checkpoint: A live power bi report running on fabric data, with no import refresh schedule.
What's next?
You just built a modern data platform solution in 3 days.
- Day 4: Add a pipeline to orchestrate the refresh of the dataflows/notebooks.
- Day 5: Add row-level security (RLS) to the semantic model.
- Day 6: Start your second subject area.
Don't overthink the migration. Pick a slice, move it, learn, and repeat.
related posts
Spark optimization in fabric notebooks: the logic vs physics split
Your notebook code is logic. Your spark configuration is physics. Understanding this split and what you can actually control at each fabric SKU level makes everything faster and cheaper.
Databricks vs fabric: which one do you actually need
Databricks gives you atomic control over everything. Fabric makes it simple and integrates with power bi. Neither is objectively better but one is probably right for your situation.
Delta lake optimization in fabric: the maintenance nobody tells you about
Delta tables get slow over time if you don't maintain them. Small files pile up, queries slow down, storage bloats. Here's how to actually fix it with optimize, z-order, and vacuum.