代码之家  ›  专栏  ›  技术社区  ›  Ryan Lanciaux

流畅的NHibernate架构问题

  •  1
  • Ryan Lanciaux  · 技术社区  · 16 年前

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

    我有两个类用户和组。用户和组之间有多对多的关系,我认为join table group_用户希望拥有一个已授权的属性(因为某些组是私有的--用户需要授权)。

    您是否建议为联接表以及用户和组表创建一个类? 目前我的课程是这样的。

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

    我真的很想能够调整小组成员的地位,我想我正在努力想最好的方法来解决这个问题。

    2 回复  |  直到 16 年前
        1
  •  1
  •   dpollock    16 年前

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

    另外,我怀疑通过实现groupmembers,最终会在用户类和组类中产生一些讨厌的集合。也就是说,组类将具有用户列表和引用用户的组成员列表,反之亦然。对我来说,这并不是很干净,而且会使维护和向表传播更改变得更加困难。

    我建议按照您的建议将join表保存在数据库中,并在用户中添加一个名为waitingtoaccept的组列表,以及(如果它也有意义)在组中添加名为waitingtoaccept的用户列表。

    然后,根据waitingtoaccept标志,从数据库中的join表中提取它们的值。

        2
  •  1
  •   dimarzionist    16 年前

    是的,当然您需要另一个类,如usergroupbridge。另一个好的副作用是,您可以修改用户成员资格和组成员,而无需将可能很重的用户/组对象加载到nhibernate会话。

    干杯。