Наиболее безболезненная реализация мульти-аренды с использованием ASP.NET, NHibernate / свободно NHibernate


Я пытаюсь реализовать мульти-аренду в ASP.NET у меня есть приложение MVC, которое использует NHibernate. Хотя у меня есть контроль над базой данных для многоквартирных домов. Я пытаюсь найти лучший способ фильтровать наши запросы к базе данных с помощью NHibernate.

Я хотел бы знать, есть ли безболезненный способ, когда я могу добавить условие (что-то вроде WHERE InstanceID = 1) к каждому запросу CRUD в БД с помощью NHibernate.

Я посмотрел на глобальные фильтры. Но я не был уверен, что использую его правильно. путь. Я попробовал что-то вроде этого.
NHibernateSession.GetDefaultSessionFactory().GetCurrentSession()
.EnableFilter("instance-filter").SetParameter("InstanceId", "2");
Но это, похоже, не сработало. Любой хороший пример NHibernate global filters / любой хороший подход фильтрации всех запросов БД с условием будет высоко оценен.
1 3

1 ответ:

Я искал то же самое для своего небольшого проекта, который все еще находится в стадии планирования. Наиболее полная реализация использования единой базы данных, на которую я наткнулся, написана Майклом Валенти в его блоге: Bolt-on Multi-Tenancy in ASP.NET MVC с Unity и NHibernate: Часть II-смешанные данные . Он также использует глобальные фильтры.

Просто для полноты, вот отображения, которые он использовал:

<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);

Есть также перехватчик для реализации-для записи значения текущего идентификатора арендатора при сохранении сущности (метод OnSave), а также для проверки принадлежности данной сущности текущему арендатору при загрузке сущности по идентификатору (методOnLoad). OnLoad переопределение необходимо, поскольку фильтр арендатора не будет применяться при загрузке объекта по идентификатору.