XML-файл отображения для связи «многие ко многим» с NHIbernate - PullRequest
1 голос
/ 21 марта 2011

У меня есть таблица Пользователь, поля: Id, Имя пользователя

У меня есть таблица UserGroup, поля: Id, UsergroupName, Код

Я бы хотел назначить несколько групп пользователей по пользователю, это значит, что мне нужна третья таблица с: UserId и UsergroupId, эта таблица называется UsersGroups

Я попробовал этот код:

Таблица пользователей, XML:

<bag name="UsersGroups" generic="true" cascade="all" inverse="false" table="UsersGroups" >
    <key column="UserId" />
    <many-to-many column="GroupId" class="LookupUserGroup" />
</bag>

Таблица пользователей, C #:

public virtual IList<UserGroup> UsersGroups { get; set; }

Таблица групп, C # (ничего в сопоставлении XML):

public virtual User User { get; set; }

Чтобы добавить группу в User, я использую AddGroup в классе User, я делаю это:

public virtual void AddGroup(UserGroup userGroup)
{
    userGroup.User = this;
    UsersGroups.Add(userGroup); 
}

Когда я делаю запрос на пользователя, я хотел бы использовать linq, чтобы проверить поле «Код» следующим образом:

var res = (from c in MyUserList where c.UserGroup.Code == 1 select c); но поле USergroup недоступно в intellisense.

Есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 марта 2011

Во-первых, дизайн ваших классов C # кажется неправильным.Они отражают не ваше намерение иметь отношения «многие ко многим», а отношения «один ко многим».Поскольку обычно не имеет смысла разрешать только одного пользователя на группу, вы должны изменить класс UserGroup на

public class UserGroup
{
    [...]

    public virtual IList<User> Users { get; set; }
}

, а также изменить отображение:

<bag name="Users" table="UsersGroups" lazy="true" cascade="all" inverse="true" >
    <key column="GroupId"></key>
    <many-to-many column="UserId" class="User" />
</bag>

Является лиLookupUserGroup класс правильный?В этом простом случае отношения «многие ко многим» у вас должно быть только два класса для трех таблиц.Если у вас есть класс User и класс UserGroup, избавьтесь от класса LookupUserGroup и замените его в отображении в User.hbm.xml.

Тогда метод AddGroup в вашем классе User будетвыглядят примерно так:

public virtual void AddGroup(UserGroup userGroup)
{
    if(!this.UsersGroups.Contains(userGroup))
    {
         this.UsersGroups.Add(userGroup);
         userGroup.Users.Add(this); 
    }
}

Причина, по которой intellisense не предлагает поле UserGroup, заключается в том, что у вас нет такого поля.Поле называется UsersGroups (должно быть UserGroups) и представляет собой IList<UserGroup>.

К сожалению, текущий поставщик Linq в NHibernate 3.0 на самом деле не поддерживает тип запроса, который вы пытаетесь выполнить здесь.Вместо этого вы можете попробовать использовать QueryOver.В вашем случае это выглядело бы так (адаптировано из NHibernate QueryOver с ManytoMany )

var result = Session.QueryOver<User>()
    .Right.JoinQueryOver<UserGroup>(x => x.UserGroups) // the .Right. might not be required
    .Where(c => c.Code == 1)
    .List();

Я не реализовывал и не тестировал ничего из этого, поэтому возможны незначительные ошибки.

1 голос
/ 21 марта 2011

Крис, короткая заметка о вашем дизайнерском решении.Если вы действительно хотите иметь реальное отношение «многие ко многим», вам не нужен третий объект (UserGroup).Вам нужны только пользователи и группы лиц.Nhibernate самостоятельно обработает создание промежуточной таблицы.Но я никогда не использую этот подход.Подход, который вы выбрали (с помощью группы пользователей), - это то, что мне нравится больше, потому что это дает вам дополнительную гибкость.Вы никогда не знаете, когда будет необходимо иметь дополнительную информацию в отношениях между пользователями и группами (дата, когда пользователь был добавлен в группу, кто создал это отношение и т. Д.). Поэтому я бы использовал сущность UsersGroups, носпособ создания отношения «один к одному» между пользователем и группами пользователей, а также множество «один к одному» между группой и группами пользователей.Таким образом, вы получаете то, что вы хотите с дополнительной гибкостью.

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