Вопрос

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

У меня есть 2 класса Пользователей и Групп.Пользователи и группы имеют отношения "многие ко многим", и я подумал, что для объединения таблицы group_users я хотел бы иметь свойство isAuthorized (поскольку некоторые группы являются частными - пользователям потребуется авторизация).

Не могли бы вы порекомендовать создать класс для таблицы join, а также для таблицы User и Groups? В настоящее время мои занятия выглядят следующим образом.

public class Groups
{
    public Groups()
    {
        members = new List<Person>();
    }
    ...
    public virtual IList<Person> members { get; set; }
}

public class User
{


    public User()
    {
       groups = new Groups()
    }
    ...
    public virtual IList<Groups> groups{ get; set; }

}

Мое отображение похоже на следующее в обоих классах (я показываю только то, что указано в отображении пользователей, но они очень похожи):

HasManyToMany<Groups>(x => x.Groups)
.WithTableName("GroupMembers")
.WithParentKeyColumn("UserID")
.WithChildKeyColumn("GroupID")
.Cascade.SaveUpdate();

Должен ли я написать класс для таблицы соединений, который выглядит следующим образом?

public class GroupMembers
{
    public virtual string GroupID { get; set; }
    public virtual string PersonID { get; set; }
    public virtual bool WaitingForAccept { get; set; }
}

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

Это было полезно?

Решение

Обычно мне нравится создавать только классы, представляющие реальные бизнес-объекты.В данном случае я не думаю, что 'groupmembers' представляет что-либо ценное в вашем коде.Для меня ORM должен сопоставить базу данных с вашими бизнес-объектами.Это означает, что ваши классы не обязательно должны в точности отражать макет базы данных.

Также я подозреваю, что, внедрив GroupMembers, вы получите несколько неприятных коллекций как в ваших пользовательских, так и в групповых классах.Т.Е.класс group будет содержать список пользователей, а также список groupmembers, который ссылается на пользователя, и наоборот для класса user.На мой взгляд, это не настолько чисто, и будет сложнее поддерживать и распространять изменения в таблицах.

Я бы предложил сохранить таблицу объединения в базе данных, как вы предложили, и добавить список групп с именем waitingtoaccept в users и (если это тоже имеет смысл) добавить список пользователей с именем waitingtoaccept в groups.

Затем они извлекут свои значения из вашей таблицы соединений в базе данных на основе флага waitingtoaccept.

Другие советы

Да, конечно, вам нужен другой класс, такой как UserGroupBridge.Другим хорошим побочным эффектом является то, что вы можете изменять членство пользователей и членов групп, не загружая потенциально тяжелые объекты User / Group в сеанс NHibernate.

Ваше здоровье.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top