Свободный вопрос по архитектуре NHibernate
-
09-06-2019 - |
Вопрос
У меня есть вопрос, над которым я, возможно, сейчас слишком много думаю, но вот он...
У меня есть 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.
Ваше здоровье.