【问题标题】:Solutions for a simple multi tenant web application with entity framework具有实体框架的简单多租户 Web 应用程序的解决方案
【发布时间】:2015-02-14 18:57:14
【问题描述】:

我正在开发一个多租户 Web 应用程序(堆栈: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);

在我的情况下你会怎么做?如有必要,我愿意重新考虑我的架构。

谢谢, 尼古拉

【问题讨论】:

    标签: entity-framework multi-tenant


    【解决方案1】:

    您可以进行反射检查,然后手动创建一个 EF 可以理解的表达式树。

    例如:

    int tenantId = 5;
    
    var tenantIdInfo = typeof(TEntity).GetProperty("TenantId");
    
    if (tenantIdInfo != null)
    {
        var entity = Expression.Parameter(typeof(TEntity), "it");
    
        var predicate = (Expression<Func<TEntity, bool>>)Expression.Lambda(
            Expression.Equal(
                Expression.MakeMemberAccess(entity, tenantIdInfo),
                Expression.Constant(tenantId, typeof(int))),
            entity);
    
        query = query.Where(predicate);
    }
    

    【讨论】:

    • 感谢您的回答。表达式应该可以工作......它是用于管理复杂问题的一段非常简单的代码。我想知道......反射“慢”还是我可以毫无问题地使用它?
    • 反射确实对性能有相当大的影响,但您需要针对您的特定场景对其进行测量,看看它是否可以接受。
    • 我进行了一些测试:一个选择查询重复了 1000 次并且只返回一行的速度大约慢了 5%。这不是一个完整的测试,但现在就足够了。如果几天后没人想出更好的主意,我会将我的问题标记为已回答。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 2011-08-17
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多