我正在开发一个多租户网络应用程序(堆栈:MVC 4 + Entity framework 4.3)。我的要求很简单:每个租户都有相同的 UI 和 CodeBase。
在我的数据库中,我有一些带有 TenantId 字段的表(而其他表没有)。
我已经建立了一个非常简单的通用存储库:
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;
}
我想要“get”方法来过滤我的tenantId。我的插入、更新和删除方法也应该约束适当的 TenantId。
我的实体是自动生成的 POCO 类。
我考虑了这些解决方案:
1- GenericRepository 应该实现定义 TenantId 的“ITenant”接口。问题是某些实体没有 TenantId 属性。另外,我不太喜欢修改我用来生成 POCO 对象的 T4 模板以使它们实现我的接口
2- 反射(当然 EF 不能将其转换为 SQL 语句)
if (typeof(TEntity).GetProperty("TenantId") != null)
query = query.Where(x => (int) (x.GetType().GetProperty("TenantId").GetValue(x, null)) == tenantId);
在我的情况下你会怎么做?如有必要,我愿意重新考虑我的架构。
谢谢,尼古拉