Reputation: 582
I have an asp.net MVC solution, Entity Framework code first, which has dozens of database tables all designed around a single company using the solution.
The requirement has come up to allow multiple companies to use the solution, so what we have done is add "CompanyID" as a column to all database tables and set a default value. There is a company table with the various company names and CompanyID's. On login the user selects the company they are logging in as which stores the CompanyID in the session.
At the moment every Entity Framework call now has to be updated to include the CompanyID, for example when selecting Employees I am doing:
List<Employee> employees = db.Employees.Where(x => x.CompanyID = Session.CompanyID).ToList();
As you can see it will be tedious to do this on thousands of calls to the db. Any update, save, and fetch has to change.
Surely I am doing it the long way and there is a way at runtime, globally to append all DB calls to include the CompanyID stored in the logged in users Session? Something that dynamically appends the CompanyID when fetching values or storing etc? Perhaps a package I can use to do this task at runtime?
Upvotes: 1
Views: 42
Reputation: 3730
In my opinion, there is no need to add CompanyID
to EVERY table in the database. I would select just "root" tables/entities for that. For example, Employee
or Department
clearly sounds like a many-to-one relationship with a company - so adding CompanyID
there sounds right. But, for example, EmployeeEquipment
which is a many-to-one relationship with Employee
does not have to have CompanyID
column since it can be filtered by the joined Employee
table.
Regarding your request to filter by CompanyID globally, I'm not aware of anything that can do that per request. There are global filters for Entity Framework, but I'm not sure how you can apply them per-request. Take a look on .HasQueryFilter()
during model creation if you are using Entity Framework Core.
Upvotes: 1