流畅的 NHibernate 架构问题

流畅的 NHibernate 架构问题

Fluent NHibernate Architecture Question

我有一个问题,我可能在这一点上想多了,但这里是……

我有 2 个类用户和组。用户和组有多对多的关系,我想加入表 group_users 我想要一个 IsAuthorized 属性(因为有些组是私有的——用户需要授权)。

您是否建议为连接表以及用户和组表创建一个类?目前我的class看起来像这样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Groups
{
    public Groups()
    {
        members = new ListPerson();
    }
    ...
    public virtual IListPerson members { get; set; }
}

public class User
{


    public User()
    {
       groups = new Groups()
    }
    ...
    public virtual IListGroups groups{ get; set; }

}

我的映射在两个类中都如下所示(我只在用户映射中显示了一个,但它们非常相似):

1
2
3
4
5
HasManyToManyGroups(x = x.Groups)
.WithTableName("GroupMembers")
.WithParentKeyColumn("UserID")
.WithChildKeyColumn("GroupID")
.Cascade.SaveUpdate();

我应该为看起来像这样的连接表编写一个类吗?

1
2
3
4
5
6
public class GroupMembers
{
    public virtual string GroupID { get; set; }
    public virtual string PersonID { get; set; }
    public virtual bool WaitingForAccept { get; set; }
}

我真的很希望能够调整组成员身份,我想我正在努力思考解决此问题的最佳方法。


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

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

我建议按照您的建议将连接表保留在数据库中,并在用户中添加一个名为 waitingtoaccept 的组列表,并且(如果也有意义的话)在组中添加一个名为 waitingtoaccept 的用户列表。

然后,这些将根据 waitingtoaccept 标志从数据库中的连接表中提取它们的值。


是的,你肯定需要另一个类,比如 UserGroupBridge。另一个好的副作用是您可以修改用户成员资格和组成员,而无需将潜在的繁重用户/组对象加载到 NHibernate 会话。

干杯。


推荐阅读