Наиболее безболезненная реализация мульти-аренды с использованием 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 ответ:
Я искал то же самое для своего небольшого проекта, который все еще находится в стадии планирования. Наиболее полная реализация использования единой базы данных, на которую я наткнулся, написана Майклом Валенти в его блоге: 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
переопределение необходимо, поскольку фильтр арендатора не будет применяться при загрузке объекта по идентификатору.