使用ASP.NET,NHibernate的/功能NHibernate大多数无痛多租户的实现(Most

2019-08-01 01:42发布

我想实现一个ASP.NET MVC应用程序,我有,使用NHibernate的多租户。 虽然我已经在数据库多租户控制。 我试图找出使用NHibernate来过滤数据库查询的最佳方式。

我想知道是否有一个无痛的方式,我可以附加一个条件(类似WHERE InstanceID = 1 )每一个CRUD查询数据库使用NHibernate。

我看着全局过滤器。 但我不知道如果我用正确的方式。 我想是这样的。

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

但它似乎并没有工作。 NHibernate的的全局过滤器的任何好的例子/筛选符合条件的所有的数据库查询的任何好的方法将高度赞赏。

Answer 1:

我一直在找我的一个小项目,该项目仍处于规划阶段同样的事情。 使用我来到由写入单个数据库的最完整的实现迈克尔Valenty在他的博客: 用螺栓固定的多租户在ASP.NET MVC使用Unity和NHibernate:第二部分-混合数据 。 他还使用全局过滤器。

只是为了完整起见,这里是他使用的映射:

<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容器注入参数值的ISession的实例。

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

还有实施拦截-保存实体(在写当前租户ID值OnSave方法),并检查通过加载ID的实体(当给定的实体是否属于当前租户OnLoad方法)。 OnLoad覆盖是必要的,因为通过ID加载实体时,租户过滤器将不会被应用。



文章来源: Most painless multi-tenancy implementation using ASP.NET, NHibernate / Fluent NHibernate