多租户支持检查Linq-to-sql实体load()

时间:2009-08-17 15:03:42

标签: linq-to-sql multi-tenant

我正在编写一个aspx应用程序,它将在公共SQL Server数据库中托管1000个小客户。所有实体都将通过Linq-To-Sql创建和加载。

代理键(标识列)将在整个模式中用于所有表关系,因此从根客户对象开始,我应该能够使用常规Linq查询导航到特定客户的独占数据集(SQL连接)

但从安全的角度来看,上面的内容有点脆弱,所以我希望增加额外的租赁检查层作为安全支持。我的实体模型中的所有实体都将具有非索引的int TenantId字段。

我正在从性能角度寻找关于此解决方案的批评意见。

public partial class MyLinqEntity

  partial void OnLoaded() // linq-to-sql extensibility function
  {
    if ( this.TennantId != HttpContext.Current.Session["tenantId"] )
      throw new ApplicationException("Logic error, LINQ query crossed tenantId data                      boundary");
  }

  partial void OnCreated() // linq-to-sql extensibility function
  {
    this.TennantId = HttpContext.Current.Session["tenantId"] );
  }

1 个答案:

答案 0 :(得分:0)

对不起,这主要是随机的想法......

我不喜欢所有依赖于HttpContext的对象。

此外,我不知道在每个对象的会话中查看是否足够快。我认为你的速度会很好,因为数据库查找通常比你正在处理的任何事情要慢得多。

我倾向于使用依赖注入框架来自动创建具有会话范围来执行检查的对象。但是,如果你不需要在其他地方使用依赖注入框架,那么这将是过度杀戮。

由于所有数据库行都有tenantId列,我希望您可以将检查移动到linq-to-sql“行读取回调”,因此您不必将其放入每个对象中。我不知道“linq-to-sql”,但是我希望你可以挂钩它的查询创建框架并在所有数据库查询中添加“where tenanted = xx”。

在所有采石场都有“tenanted = xx”,如果客户需要,可以对数据库进行分区,这样可以使“桌面扫描”等更便宜。