NHibernate - отображение нескольких таблиц? - PullRequest
0 голосов
/ 20 декабря 2011

Я работаю над проектом, который обрабатывает пользователей и проекты:

  • Пользователь может быть назначен на ноль или X проектов.
  • Пользователь имеет права на чтение или запись в проекте.

В моей базе данных есть таблица с именем Users_Projects_Rights, которая используется для привязки пользователя к определенному количеству проектов, а также для определения их прав доступа к ним (это просто логическое значение, true для прав записи, false для прав чтения).

Столбцы таблицы Users_Projects_Rights:

  • id_User
  • id_Project
  • CanWrite (логическое значение)

Мой класс пользователя в настоящее время имеет следующие коллекции:

    /// <summary>
    /// Gets or sets a user's accessible projects, with the value being 
    /// the name of the project.
    /// </summary>
    public virtual IDictionary<int, string> AssignedProjects { get; set; }

Учитывая, что у меня есть таблица Projects, в которой есть столбец Name:

  • Как мне сопоставить мой словарь AssignedProjects в моем классе User, чтобы в качестве ключа использовался Id проекта (используя троичное отображение с таблицей Users_Projects_Rights) и имя проекта (взятое из таблицы Projects) в качестве значения

Вот то, что я придумал, но я не знаю, как отобразить значение словаря:

<map name="AssignedProjects" table="Users_Projects_Rights">
  <key column="id_User"/>
  <map-key column="id_Project" type="Int32"/>
  (How do I map the value... ?)
</map>

Ответы [ 2 ]

0 голосов
/ 20 декабря 2011

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

<map name="AssignedProjects" table="Users_Projects_Rights">
  <key column="id_User"/>
  <index column="id_Project" type="System.Int32"/>
  <element formula="(SELECT Projects.name FROM Projects WHERE Projects.id = id_Project)"/>
</map>
0 голосов
/ 20 декабря 2011

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

публичный виртуальный IDictionary AssignedProjects {get;задавать;}

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

public virtual List AssignedProjects {get;задавать;}

...