流利的NHibernate架构问题

时间:2020-03-05 18:54:57  来源:igfitidea点击:

我有一个问题,我可能会在这一点上进行思考,但是这里...

我有2个班级的用户和组。用户和组之间存在多对多的关系,我当时在想联接表group_users我想拥有一个IsAuthorized属性(因为某些组是私有的-用户将需要授权)。

我们是否建议为联接表以及"用户和组"表创建一个类?目前,我的课程看起来像这样。

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; }
}

我真的很希望能够调整组成员身份,并且我想我正在考虑实现此目的的最佳方法。

解决方案

回答

是的,请确保我们需要另一个类,例如UserGroupBridge。另一个好的副作用是,我们可以修改用户成员资格和组成员,而无需将可能很重的User / Group对象加载到NHibernate会话中。

干杯。

回答

我通常只喜欢创建代表实际业务实体的类。在这种情况下,我认为" groupmembers"在代码中不代表任何有价值的东西。对我来说,ORM应该将数据库映射到业务对象。这意味着类不必完全镜像数据库布局。

我也怀疑通过实现GroupMembers,我们最终将在用户和组类中出现一些讨厌的集合。 IE。组类将具有用户列表以及引用用户的组成员列表,反之亦然。对我来说,这还不是很干净,会使维护和将更改传播到表变得更加困难。

我建议按照建议将联接表保留在数据库中,并在用户中添加一个名为waitingtoaccept的组列表,(如果也可以)在组中添加一个名为waitingtoaccept的用户列表。

然后,这些将根据waitingtoaccept标志从数据库的联接表中拉出它们的值。