Sponsor: Using RabbitMQ or Azure Service Bus in your .NET systems? Well, you could just use their SDKs and roll your own serialization, routing, outbox, retries, and telemetry. I mean, seriously, how hard could it be?
There are many different ways to handle multi-tenancy. This blog post will cover one approach to EF Core Multi-Tenancy that will work if you are using a shared database approach, meaning you use the same database for multiple tenants, that are disambiguated using tenant ID column.
If you want more details on Multi-Tenancy, check out the Microsoft Docs on the topic, related to designing multi-tenant apps using Azure SQL Database.
Entity
Let’s jump right into some sample code of a simple Entity that represents a customer. Notice the TenantId.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
The approach we are going to use is to pre-filter any DbSet in our DbContext. We can do this by using the EntityFramework-Plus package.
It provides us the ability to specify per context instance how to pre-filter our DbSets. We can do this by adding our TenantId as a ctor parameter and use the Filter<T> extension method.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Here’s a small console app that adds two new customer records both with the same CustomerId = 1. When creating the MyDbContext, we the TenantId we want to pre-filter on.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
All the source code for my demo is available on GitHub if you want to try it yourself.
If anyone has any other suggestions or recommendations about blog topics, please leave comment or let me know on twitter.