NHibernate - использование префиксов таблиц для конкретного клиента - PullRequest
1 голос
/ 25 апреля 2011

Мы разрабатываем мультитенантное приложение, использующее NHibernate, в котором все арендаторы совместно используют одну и ту же базу данных.

Один из вариантов, который мы рассмотрели, заключался в использовании префикса, специфичного для арендатора, для наших объектов базы данных (я полагаю, что этот подход был принятOrchard).

Это, по крайней мере, дало бы нам какую-то модель восстановления данных арендатора и означало бы, что нам не нужно будет включать фильтр tenantid в большинство наших запросов.

Такмой вопрос - кто-нибудь использовал эту стратегию?Если да, то как вы это сделали?

В частности, можем ли мы использовать один и тот же SessionFactory для всех арендаторов и можем ли мы использовать NHibernate для генерации нового набора таблиц для "нового" арендатора во время выполнения (так ли это?это безопасно).

Спасибо, Бен

[Обновление]

Это было стоящее исследование, но в итоге мы решили, что общая схема больше подходит для наших нужд.Схема для каждого арендатора, несомненно, обеспечивает лучшее разделение данных арендатора, но усложняет обслуживание.Поскольку наши арендаторы хранят только небольшие объемы данных, мысль о наличии 10 таблиц * 1 тыс. Арендаторов немного отталкивает.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2011

Есть пара моментов настройки / расширения, которые вы можете рассмотреть.

Не думаю, что вы сможете совместно использовать одну и ту же фабрику сессий для арендаторов. Я думаю, что самое простое, что можно сделать, - это обновить сопоставления на основе клиента, связанного с фабрикой сеансов.

public class EntitytMap:ClassMap<Entity>
{
     public EntitytMap()
    {
        Table("TableName");
        Schema(Session.TenantName);
        Id(p => p.Id, "Id").GeneratedBy.Identity();

Если вы хотите, чтобы каждый арендатор имел собственную схему, это должно работать. Если вы хотите сохранить схему такой же, но у вас есть префикс в таблице, вы можете изменить ее на:

public class EntityMap:ClassMap<Entity>
{
     public EntityMap()
    {
        Table(Session.TenantPrefix + "TableName");
        Schema("SCHEMA");
        Id(p => p.Id, "Id").GeneratedBy.Identity();

Вы также можете указать свой собственный ConnectionProvider. Извлеките класс из NHibernate.Connection.DriverConnectionProvider и сделайте ссылку на свою собственную копию в файле конфигурации nhibernate вместо:

 <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

использовать

<property name="connection.provider">My.Project.DAL.NHibernate.CustomConnectionProvider, My.Project.DAL</property>

Когда вызывается провайдер GetConnection, вы можете указать собственную строку соединения на основе арендатора.

0 голосов
/ 27 апреля 2011

можем ли мы использовать NHibernate для генерации нового набора таблиц для «нового» арендатора во время выполнения (это безопасно)

Я бы предположил, что вы нене хочу предоставлять вашему веб-приложению уровень разрешений, необходимый для выполнения этих задач DDL.Я бы оставил веб-приложение с минимальным уровнем разрешений для обычных операций DML и имел бы фоновую службу, работающую как «Служба инициализации».Его роль будет заключаться в изменении схемы для нового арендатора, и это также хорошее место, чтобы ставить любые другие задачи обеспечения арендатора, такие как создание новых папок, настройка IIS и т. Д. Все эти задачи также требуют времени и лучше всего их не выполнять в одной сети.запрос.Фоновая база данных может обновлять таблицу обеспечения, обновляя ее информацией о ее ходе до ее завершения, и веб-интерфейс переходит к следующему шагу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...