gpt4 book ai didi

entity-framework - 具有 Entity Framework 的简单 Multi-Tenancy Web 应用程序的解决方案

转载 作者:行者123 更新时间:2023-12-03 07:30:08 24 4
gpt4 key购买 nike

我正在开发一个 Multi-Tenancy 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”接口(interface)。问题是某些实体没有 TenantId 属性。另外,我不太喜欢修改我用来生成 POCO 对象的 T4 模板,让它们实现我的接口(interface)

2-反射(但是EF当然无法将其转换为SQL语句)

if (typeof(TEntity).GetProperty("TenantId") != null)
query = query.Where(x => (int) (x.GetType().GetProperty("TenantId").GetValue(x, null)) == tenantId);

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

谢谢,尼古拉

最佳答案

您可以进行反射检查,然后手动创建 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);
}

关于entity-framework - 具有 Entity Framework 的简单 Multi-Tenancy Web 应用程序的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11412626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com