Asp.net mvc 3 &引用;注入;动态w/PetaPoco的WHERE子句

Asp.net mvc 3 &引用;注入;动态w/PetaPoco的WHERE子句,asp.net-mvc-3,ninject,multi-tenant,petapoco,Asp.net Mvc 3,Ninject,Multi Tenant,Petapoco,我正在使用.NET MVC 3和PetaPoco构建一个具有共享数据库的多租户应用程序。 租户id(以及其他信息)在登录时保存在FormsAuth cookie中,并可通过BaseController属性供所有控制器使用。大多数表(即除主“租户”表外)都包含一个租户列 与手动向功能表上的所有CRUD添加“WHERE TenantId=X”不同,有没有一种方法可以在执行查询之前将其动态添加到查询中?换句话说,可能需要维护一个表列表,如果查询是针对其中一个表的,那么动态地添加到TenantId过滤器

我正在使用.NET MVC 3和PetaPoco构建一个具有共享数据库的多租户应用程序。 租户id(以及其他信息)在登录时保存在FormsAuth cookie中,并可通过BaseController属性供所有控制器使用。大多数表(即除主“租户”表外)都包含一个租户列

与手动向功能表上的所有CRUD添加“WHERE TenantId=X”不同,有没有一种方法可以在执行查询之前将其动态添加到查询中?换句话说,可能需要维护一个表列表,如果查询是针对其中一个表的,那么动态地添加到TenantId过滤器中


当然,它的好处是不需要手动添加过滤器,从而减少遗漏的机会。我确实找到了一个新的方法,我怀疑它是否可以被重新利用。我正在使用Ninject,以防有什么不同

数据库类上有一个OnCommandExecuting方法,您可以在自己的子类中重写该方法,并在执行sql之前根据需要修改sql。我们使用此功能在Sql Server和Oracle之间转换isnull/nvl


您可以在sql中保留一个标记,然后在此处替换它。

数据库类上有一个OnCommandExecuting方法,您可以在自己的子类中重写该方法,并在执行sql之前根据需要修改它。我们使用此功能在Sql Server和Oracle之间转换isnull/nvl


您只需在sql中留下一个标记,然后在此处替换它。

您正试图用应用程序存储何种数据。以这种方式使用动态SQL可能存在安全/SQL注入风险通常是的,但我们实际上使用的是参数化SQL(默认情况下PetaPoco会这样做),所以这不应该是一个问题。我没有在帖子中提到它,因为它与实际问题无关。但谢谢你指出:)好交易。我对PetaPoco不太熟悉,所以当我一开始看到它时,我就畏缩了:)你想用你的应用程序存储什么样的数据。以这种方式使用动态SQL可能存在安全/SQL注入风险通常是的,但我们实际上使用的是参数化SQL(默认情况下PetaPoco会这样做),所以这不应该是一个问题。我没有在帖子中提到它,因为它与实际问题无关。但谢谢你指出:)好交易。我对PetaPoco不太熟悉,所以一开始看到它我就畏缩了:)谢谢——那会有用的。但是,如果IDB命令具有联接,并且您只希望将筛选器应用于某些表,则可能会变得很棘手。标记可能会克服这一点,除了如果我在sql中添加标记,我还可以直接添加TenantId过滤器(因为开发人员忘记“添加”的“问题”仍然存在)。我想我可能会选择在基本存储库中使用GetByTenant(而不是“Get”),除非有更好的解决方案。谢谢你的帮助!是的,但是如果提到某个表,您还可以检查标记是否存在,否则抛出异常。我还使用了一个helper函数,它附加了一个exists子句,在该子句中我使用了一个comment/*SECURITY*/etc,然后在执行之前检查它,否则会抛出一个异常。谢谢-这会起作用。但是,如果IDB命令具有联接,并且您只希望将筛选器应用于某些表,则可能会变得很棘手。标记可能会克服这一点,除了如果我在sql中添加标记,我还可以直接添加TenantId过滤器(因为开发人员忘记“添加”的“问题”仍然存在)。我想我可能会选择在基本存储库中使用GetByTenant(而不是“Get”),除非有更好的解决方案。谢谢你的帮助!是的,但是如果提到某个表,您还可以检查标记是否存在,否则抛出异常。我还使用了一个helper函数,它附加了一个exists子句,在该子句中我使用了一个comment/*SECURITY*/etc,然后在执行之前检查它,否则会抛出一个异常。