asp.net-mvc - 使用 ASP.NET、NHibernate/Fluent NHibernate 实现最轻松的 Multi-Tenancy

标签 asp.net-mvc nhibernate fluent-nhibernate multi-tenant

我正在尝试在我拥有的使用 NHibernate 的 ASP.NET MVC 应用程序中实现 Multi-Tenancy 。虽然我可以控制 Multi-Tenancy 的数据库。我正在尝试找出使用 NHibernate 过滤数据库查询的最佳方法。

我想知道是否有一种轻松的方法可以让我使用 NHibernate 将条件(例如 WHERE InstanceID = 1)附加到对数据库的每个 CRUD 查询。

我查看了全局过滤器。但我不确定我是否以正确的方式使用它。我试过这样的事情。

NHibernateSession.GetDefaultSessionFactory().GetCurrentSession()
.EnableFilter("instance-filter").SetParameter("InstanceId", "2");

但是好像没有用。任何 NHibernate 全局过滤器的好例子/任何使用条件过滤所有数据库查询的好方法都将受到高度赞赏。

最佳答案

我一直在为我的一个仍处于规划阶段的小项目寻找同样的东西。我遇到的使用单个数据库的最完整实现是由 Michael Valenty 编写的在他的博客文章中:Bolt-on Multi-Tenancy in ASP.NET MVC with Unity and NHibernate: Part II – Commingled Data .他还使用全局过滤器。

为了完整起见,以下是他使用的映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <filter-def name="tenant">
        <filter-param name="id" type="System.Int32" />
    </filter-def>
</hibernate-mapping>

对于每个实体:

<class name="User" table="[user]">
    <id name="Id" column="user_id">
        <generator class="identity" />
    </id>

    <property name="Username" />
    <property name="Email" />

    <filter name="tenant" condition="tenant_id = :id" />
</class>

之后,他使用他选择的 IoC 容器将参数值注入(inject) ISession 实例。

session.EnableFilter("tenant").SetParameter("id", c.Resolve<Tenant>().Id);

还有一个拦截器要实现——保存实体时写入当前租户id的值(OnSave方法),加载实体时检查给定实体是否属于当前租户通过 id(OnLoad 方法)。 OnLoad 重写是必需的,因为在按 id 加载实体时不会应用租户过滤器。

关于asp.net-mvc - 使用 ASP.NET、NHibernate/Fluent NHibernate 实现最轻松的 Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12667467/

相关文章:

c# - 服务器和浏览器 ASP.NET MVC 之间的 CultureInfo 冲突

nhibernate - 在 session.GetNamedQuery() 上获取 "Named Query Not Know"错误

c# - 将长类型列从 Oracle 映射到 Nhibernate

asp.net - 为什么我的 ASP.NET MVC 持久身份验证 cookie 不起作用?

asp.net-mvc - 将 ASP.NET MVC 应用程序与 Entity Framework 解耦

asp.net-mvc - asp.net mvc - 如何在路由中配置默认​​参数

c# - NHibernate 父子关系和子只知道parentId(外键违规)

nhibernate - 使用 NHibernate 映射分区数据的方法

nhibernate - Fluent Nhibernate 中的自定义 Tuplizer

fluent-nhibernate - 来自 appSettings 的流利 NHibernate