entity-framework – 具有实体框架的简单多租户Web应用程序的解决方案

entity-framework – 具有实体框架的简单多租户Web应用程序的解决方案,第1张

概述我正在开发一个多租户Web应用程序(堆栈:MVC 4实体框架4.3). 我的要求非常简单:每个租户都有相同的UI和CodeBase. 在我的数据库中,我有一些带有TenantId字段的表(和其他表没有). 我已经建立了一个非常简单的通用存储库: public class GenericRepository<TEntity> where TEntity : class{ internal 我正在开发一个多租户Web应用程序(堆栈:MVC 4实体框架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);

你会怎么做?如有必要,我愿意重新考虑我的架构.

谢谢,
尼古拉

解决方法 您可以执行反射检查,然后手动创建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 – 具有实体框架的简单多租户Web应用程序的解决方案全部内容,希望文章能够帮你解决entity-framework – 具有实体框架的简单多租户Web应用程序的解决方案所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1077226.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存