Много ко многим с подразумеваемыми и явными отношениями - PullRequest
0 голосов
/ 22 июля 2011

В моей базе данных есть стандартные отношения «многие ко многим» между Person и Widget.Человек с административной ролью имеет доступ ко ВСЕМ виджетам.В моем приложении я хочу увидеть, к каким виджетам у человека есть доступ.

У меня есть два варианта высокого уровня:

  1. Явно управляйте отношениями.Когда человек становится администратором, свяжите его со всеми существующими виджетами.Когда виджет создан, свяжите этот виджет со всеми существующими администраторами.

  2. Во время выполнения, если это администратор, предположите, что у них есть доступ ко ВСЕМ виджетам и обходят таблицу отношенийпри загрузке виджетов.

Один вариант лучше другого?Есть ли имя для этого сценария?

Я пытался применить вариант 2 с помощью NHibernate, и я не могу понять, как заставить его обходить таблицу отношений при загрузке всех виджетов длясущность (и даже если бы я мог, это привело бы к ненужной загрузке большого количества информации, если бы я не загружал виджеты отдельно от сущности Person и не применял подкачку страниц).

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Я бы сопоставил это с помощью ролей.

Роли: Человек = 1: Много

Поэтому, когда вы создаете человека, вы также создаете новую роль, если только он не является администратором, и в этом случае он использует существующую роль администратора.

Тогда проблема проста: вам нужна таблица WidgetRole.

Когда создается новый виджет и запись автоматически добавляется в таблицу WidgetRole для NewWidget, AdminRole

Когда человек переходит на роль администратора, просто измените его текущую роль.

imo эта настройка логически проще, чем наличие особого случая администратора.

0 голосов
/ 22 июля 2011

Я должен был поделиться окончательным решением - должно помочь любому, кто пытается заставить NH загрузить отношения, которые не указаны в БД.

Я уже создавал подклассы человека, а NHibernate достаточно умен.чтобы распознать Администратора: Person и создать его в качестве Администратора (где у Администратора есть таблица с PK / FK PersonId)

Я только что добавил новое переопределение сопоставления для Администратора ...

mapping.HasManyToMany(x => x.Widgets)
  .Table("AdministratorWidgetAccess")
  .Cascade.None();

И я добавил представление с именем AdministratorWidgetAccess ...

SELECT a.PersonId as [AdministratorId], w.WidgetId as 
FROM dbo.Administrator AS a LEFT OUTER JOIN
  dbo.Widget AS w ON 1 = 1

Во время работы, если человек является администратором, он загружает все виджеты на основе отношений в представлении, в противном случае он загружает виджеты на основестол соединения.

...