Tag: 多租户

与Linq一起使用DbContext时执行AS

我正在设计一个多租户数据库,每个租户都有一个相应的数据库用户。 为用户分配与租户关联的架构的访问权限以及dbo架构中对象的特定权限。 一旦我确定了租户,我想通过执行如下所示的SQL语句切换到适当的用户上下文: EXECUTE AS User = ‘Tenant1’ WITH NO REVERT 当我使用DbContext的Database属性的ExecuteSqlCommand执行此命令时,一切似乎都正常工作。 当我稍后使用Linq更改模型并调用该方法时 myDbContext.SaveChanges(); 我得到一系列例外情况: 在提供程序连接上启动事务时发生错误。 有关详细信息,请参阅内部exception 内部例外: 当前命令发生严重错误。 结果(如果有的话)应该被丢弃。 是否有可能以这种方式更改用户的执行上下文,如果是这样,最好的方法是什么?

多个ASP.NET Web应用程序,取决于常见的基本应用程序

我有不同客户的多个SQL Server数据库(相同的架构)。 他们将共享一个通用的ASP.NET Web应用程序。 如果其中一个客户想要一个自定义版本的网页,我们将在他的目录(或项目)中创建一个新的。 例: /Main Application/WebPage.aspx /Main Application/WebPage2.aspx /Main Application/Customer 1/WebPage.aspx /Main Application/Customer 2/WebPage.aspx 目前,我有以下项目结构 Solution (Main application) ASP.NET Main Project Other projects (BLL, DAL, etc.) Solution (Customer 1) ASP.NET Project Other projects (BLL, DAL, etc.) Same thing for Customer 2 在每个客户解决方案中,我添加了对主应用程序项目的引用,以解决依赖关系,并使用未自定义的网页。 每个ASP.NET项目代表一个不同的IIS虚拟目录,因此我们在此示例中有3个。 (/ Main,/ Main / Customer1,/ Main / Customer2)。 我现在遇到的问题是当我尝试连接到正确的数据库时。 每个解决方案内的每个ASP.NET项目都有一个带有客户数据库连接字符串的web.config文件。 […]

多租户:每个租户的单个数据库

我们正在开发一个多租户应用程序。 在架构方面,我们为业务逻辑设计了共享中间层,为每个租户设计了一个数据持久性数据库。 如果说,业务层将与每个租户的数据库服务器建立连接集(连接池)。 这意味着应用程序为每个租户维护单独的连接池。 如果我们期望大约5000个租户,那么此解决方案需要高资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。 我们通过保持公共连接池来解决这个问题。 为了在不同的数据库中维护单个连接池,我们创建了一个名为“App-master”的新数据库。 现在,我们始终首先连接到“App-master”数据库,然后将数据库更改为特定于租户的数据库。 这解决了我们的连接池问题。 此解决方案与内部部署数据库服务器完美配合。 但它不适用于Azure Sql,因为它不支持更改数据库。 提前感谢建议如何维护连接池或更好的方法/最佳实践来处理此类多租户方案。

具有DbContext和TenantId的MultiTenancy – 拦截器,filter,EF代码优先

我的组织需要一个共享数据库,共享模式多租户数据库。 我们将根据TenantId进行查询。 我们将只有极少数租户(少于10个),并且所有租户都将共享相同的数据库架构,不支持特定于租户的更改或function。 租户元数据将存储在内存中,而不是存储在DB(静态成员)中。 这意味着所有实体现在都需要一个TenantId, DbContext需要知道默认情况下对此进行过滤。 TenantId可能会被标头值或原始域标识,除非有更明智的方法。 我已经看到各种样本利用拦截器,但没有看到TenantId实现的明确示例。 我们需要解决的问题: 我们如何修改当前架构来支持这个(简单的我想,只需添加TenantId) 我们如何检测租户(简单 – 基于原始请求的域或标头值 – 从BaseController拉出) 我们如何将它传播到服务方法(有点棘手…我们使用DI通过构造函数进行水合…希望避免使用tenantId对所有方法签名进行tenantId ) 一旦我们有了它,我们如何修改DbContext来过滤这个tenantId(不知道) 我们如何优化性能。 我们需要什么索引,我们如何确保查询缓存没有做任何与tenantId隔离等相关的时髦(不知道) 身份validation – 使用SimpleMembership,我们如何隔离User ,以某种方式将他们与租户联系起来。 我认为最大的问题是4 – 修改DbContext。 我喜欢本文如何利用RLS,但我不知道如何以代码优先,dbContext方式处理它: https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-entity-framework-row-level-security/ 我想说的是我想要的是一种方法 – 考虑到性能 – 使用DbContext有选择地查询tenantId隔离的资源,而不用我的调用”AND TenantId = 1″等。 更新 – 我找到了一些选项,但我不确定每个选项的优缺点是什么,或者是否有一些“更好”的方法。 我对选项的评估归结为: 易于实施 性能 方法A. 这似乎“昂贵”,因为每次我们新建dbContext时,我们都必须重新初始化filter: Row level security in EntityFramework 6 (EF6) 首先,我设置了我的租户和界面: public static […]

使服务层可以访问对象,而不在MVC4应用程序中作为参数传递

我正在构建一个多租户MVC应用程序,其中有一个应用程序池和单个数据库。 我有一个租户表,我的每个模型都有一个TenantId标识。 每个租户都有一个字符串“Url”,用于标识用于访问该租户数据的完整URL。 我可以通过以下(粗略近似)从我的BaseController访问它: HttpRequest request = HttpContext.Current.Request; Uri requestUrl = request.Url; _tenant = _tenantService.GetTenantByUrl(requestUrl); 现在,我需要将租户传递到服务层以执行业务逻辑。 我可以这样做的一种方法是跨所有服务(约200种方法)查看每个方法并添加一个Tenant参数。 我必须触及每个服务层的调用 ,以及每个服务层方法 。 这样可以工作,但这很繁琐并且使代码混乱。 例如,我以前的一种方法: public void DeleteUserById(int userId) { using (var db = CreateContext()) { var user = db.Users.FirstOrDefault(u => u.UserId.Equals(userId)); InternalDeleteUser(db, user); } } 之后(如果我通过租客): public void DeleteUserById(Tenant tenant, int userId) { using (var db = […]

连接到多租户应用程序的数据库?

我正在创建一个Multi-Tenant asp.net应用程序。 我在单独的MSSQL数据库或模式之间做出决定。 但是,我无法找到有关如何动态更改数据库(理想情况下)或用户帐户的任何信息,具体取决于用户应连接到哪个帐户。 我很可能会有一个基表来定义用户应该连接到哪个数据库。 使用Linq to SQL执行此操作非常简单,但我并不是在任何地方都使用Linq,因为这些表非常动态,而且架构很容易经常更改。 这样做的最佳方法是什么? 我很高兴看到使用Schemas,但我不希望它变得非常混乱,但我还需要做一个类似的方法,但不知何故以同样的方式冒充该用户来拾取默认模式。 我知道你可以动态更改web.config连接字符串,但我已经尝试过,它实际上更改了文件内容,这也刷新了应用程序池,并导致了很多其他问题。 谢谢

具有过滤的dbContext的多租户Web应用程序

我是ASP.Net MVC和多租户Web应用程序的新手。 我做了很多阅读,但作为初学者,我只是按照我的理解。 所以我设法构建了一个示例场景Web应用程序,需要解决它的结尾部分。 希望这种情况对其他一些初学者也有用,但欢迎任何其他方法。 提前致谢 1)SQLServer 2008中的数据库。 2)数据层:名为MyApplication.Data的C#类库项目 public class AppUser { [Key] public virtual int AppUserID { get; set; } [Required] public virtual int TenantID { get; set; } [Required] public virtual int EmployeeID { get; set; } [Required] public virtual string Login { get; set; } [Required] public virtual string Password { […]

虚拟导航属性和多租户

我有一个标准的DbContext ,代码如下: public DbSet Interests { get; set; } public DbSet Users { get; set; } 我最近通过创建一个包含以下内容的TenantContext来实现多租户: private readonly DbContext _dbContext; private readonly Tenant _tenant; public TenantContext(Tenant tenant) : base(“name=DefaultConnection”) { this._tenant = tenant; this._dbContext = new DbContext(); } public IQueryable Users { get { return FilterTenant(_dbContext.Users); } } public IQueryable Interests { get { […]