2008-09-16 2 views
1

У меня есть вопрос, что я, возможно, задумываюсь на данный момент, но здесь идет ...Fluent NHibernate Architecture Вопрос

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

Вы бы рекомендовали создать класс для таблицы соединений, а также таблицу User and 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; } 
} 

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

ответ

1

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

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

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

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

1

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

Cheers.