【问题标题】:How to configure Dapper for Multi-tenant tables?如何为多租户表配置 Dapper?
【发布时间】:2018-06-04 13:03:22
【问题描述】:

我有多租户表结构,而每个表都有TenantId,我使用Dapper 作为唯一的ORM 以及SimpleCRUD(助手位于dapper 的顶部)。如果可能(默认情况下)我更喜欢每个Read Query 必须自动将TenantId 作为parameter 传递,否则怕有机会忘记。

想知道其他人是如何解决这个案子的吗?有没有有效的方法来解决这个问题?

【问题讨论】:

  • 这感觉像是一个流程问题,而不是代码合约问题。您当然可以编写 Roslyn 诊断程序来强制执行此操作,但是您在什么时候足够信任您的代码审查过程以使其驱动正确的功能?简短的回答是否定的,我认为 Dapper 中没有任何东西可以为您处理此案。 Dapper 的部分优点在于灵活性。
  • 嗨@CoderAbsolute,我可能会尝试行级安全(docs.microsoft.com/en-us/sql/relational-databases/security/…)作为更理想的解决方案。
  • @Nick:是的,我继续使用行级安全性,到目前为止做得很好。谢谢!
  • 话题不大,但是(在可能的情况下)我总是有更好的运气,每个租户都有一个单独的数据库,而不是一个数据库来容纳多个租户。
  • @CoderAbsolute 我知道您继续使用 RLS。我知道要使 RLS 工作,您必须在用户的上下文中执行 SQL 查询,即“EXECUTE AS USER = 'tenant1'”。您如何确保 dapper 发出的每个调用都以该语句开头?我能想到的一种方法是您创建一个在“执行为”语句之前添加的包装器,但我对您的想法很感兴趣。

标签: c# dapper multi-tenant dapper-simplecrud


【解决方案1】:

Dapper 是一个微型 ORM,据我所知它没有这种功能。

在 Entity Framework 6 中,您可以使用拦截器强制查询按 TenantId 进行过滤。

在 Entity Framework Core 中,您可以使用 QueryFilters。

在 SqlServer 中,您可以独立于 ORM 使用行级安全性。

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 2017-10-06
    • 2018-03-11
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 2021-12-11
    • 2012-08-11
    • 2023-03-07
    相关资源
    最近更新 更多