Самый простой подход - использовать разные базы данных для каждого клиента.
Реализация мультитенантности таким способом позволяет эффективно писать приложение для одного арендатора и беспокоиться о мультитенантности только в том месте, где вы создаете / извлекаете сеанс.
Я еще не углубился в детали (мне нужно сделать что-то подобное через несколько месяцев), но я думаю, что самый простой способ управлять базой данных, к которой подключен сеанс, - это пользовательская реализация ISessionFactory, которая может определить, какое соединение использовать (на основе внешнего аспекта, такого как часть узла URL-адреса запроса).
Я видел по крайней мере один пост в сети, где-то обсуждается это, но я не могу найти ссылку в настоящее время.
Если вы используете Castle Windsor, взгляните на средство интеграции NHibernate. Это поддерживает концепцию нескольких (именованных) фабрик сессий, которые позволят вам иметь фабрику сессий для каждого клиента. Средство интеграции предоставляет интерфейс ISessionManager, который позволяет открывать сеанс в именованной фабрике сеансов (а также предоставлять семантику сеансов по запросу для веб-приложений). Все, что требует доступа к сеансу, может просто принять параметр конструктора ISession, и вы можете создать фабрику, которая принимает ISessionManager в качестве параметра конструктора. Затем ваша фабрика может открыть сеанс в соответствующей именованной фабрике сеансов, проверив запрос, чтобы определить, какую именованную фабрику сеансов следует использовать.