Microsoft Fabric puts data engineering, warehousing, real-time analytics and Power BI on a single platform with a single copy of data in OneLake. For most organizations the question is no longer whether to adopt it, but how to get there without breaking the dashboards that executives open every morning.
Across migrations we have led, the teams that succeed share a few habits. None of them is glamorous. All of them matter more than the choice between a lakehouse and a warehouse.
1. Start from decisions, not workloads
Inventory what you have—dataflows, semantic models, reports and the refresh schedules that tie them together—and rank it by business criticality and actual usage. Usage metrics will usually show that a small share of content carries most of the value. Migrate that first, retire what nobody opens, and leave stable, low-value content alone until there is a reason to touch it.
Map dependencies before you move anything. A report is rarely a single object: it depends on a model, which depends on dataflows, which may depend on each other by name.
2. Move in thin slices
A “big bang” cut-over concentrates risk on a single weekend. Instead, move one subject area at a time: rebuild its ingestion as Data Factory pipelines or Dataflows Gen2 landing in a lakehouse, point a copy of the semantic model at the new source, and run old and new side by side until the numbers match.
Preserve the names that downstream objects reference. Renaming a query or table that other queries call by name is one of the most common—and most avoidable—causes of failed refreshes after a migration.
3. Put everything in Git from day one
Fabric’s Git integration, together with the PBIP, PBIR and TMDL formats, means models and reports can finally be reviewed, diffed and rolled back like code. Use it from the first sprint:
- Connect each development workspace to a branch in Azure DevOps or GitHub, and commit only the items you own.
- Promote through deployment pipelines from development to production, never by editing production directly.
- Keep development capacity quiet: run refreshes there on demand rather than on a schedule, and reserve scheduled refresh for production.
4. Verify with data, not with a green checkmark
“Deployment succeeded” means the definition was accepted. It does not mean every measure compiles, every relationship behaves or every total is right. After each deployment, query the model itself—for example with DAX through the REST API—and check that measures evaluate without errors.
Then reconcile to source at the most granular level you can afford: by month, by entity, and ideally by transaction line. When old and new agree to the line, sign-off conversations become very short.
5. Schedule around the data, not the clock
Refreshing a model at 6:00 a.m. is pointless if the upstream warehouse sometimes finishes at 7:45. Measure when upstream loads actually complete—median and worst case—and schedule against the worst case, or orchestrate refreshes so they trigger when upstream jobs finish. Add alerts for failed or late refreshes so the business hears about problems from you, not from a stale dashboard.
6. Let security travel with the model
Row-level and object-level security should be defined in the model, version-controlled with it and tested on every release. A migration is the ideal moment to replace hard-coded user lists with identity-based rules. We cover how in Row-level security that scales.
The payoff
Teams that follow these habits end up with more than a new platform. They gain a delivery process in which every change is reviewed, every release is verified and every number can be traced to its source. That process—not any single feature—is what makes Fabric pay back.