Lösungen für eine einfache mandantenfähige Webanwendung mit Entity Framework
Ich entwickle eine mandantenfähige Webanwendung (Stapel: MVC 4 + Entity Framework 4.3). Meine Anforderungen sind ziemlich einfach: Jeder Mandant hat die gleiche Benutzeroberfläche und CodeBase.
In meiner Datenbank habe ich einige Tabellen mit einem TenantId-Feld (und andere Tabellen ohne).
Ich habe ein sehr einfaches generisches Repository eingerichtet:
public class GenericRepository<TEntity> where TEntity : class
{
internal Database.CRMEntities context;
internal DbSet<TEntity> dbSet;
internal int tenantId;
public GenericRepository(Database.CRMEntities context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
this.tenantId = 1;
}
Ich möchte die "get" -Methoden, um nach meiner TenantId zu filtern. Meine Methode zum Einfügen, Aktualisieren und Löschen sollte auch die entsprechende TenantId einschränken.
Meine Entitäten sind automatisch generierte POCO-Klassen.
Ich habe diese Lösungen in Betracht gezogen:
1- GenericRepository sollte eine "ITenant" -Schnittstelle implementieren, die TenantId definiert. Das Problem ist, dass einige Entitäten nicht über die TenantId-Eigenschaft verfügen. Außerdem mag ich es nicht wirklich, die T4-Vorlage zu ändern, die ich zum Generieren von POCO-Objekten verwende, damit sie meine Schnittstelle implementieren
2- Reflexion (aber EF kann es natürlich nicht in eine SQL-Anweisung übersetzen)
if (typeof(TEntity).GetProperty("TenantId") != null)
query = query.Where(x => (int) (x.GetType().GetProperty("TenantId").GetValue(x, null)) == tenantId);
Was würden Sie in meinem Fall tun? Ich bin bereit, meine Architektur bei Bedarf zu überdenken.
Danke, Nicola