Fluent NHibernate架构问题
-
09-06-2019 - |
题
我有一个问题,我现在可能想得太多了,但这里是......
我有 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; }
}
我真的很希望能够调整群组成员身份,并且我想我正在尝试考虑解决此问题的最佳方法。
解决方案
我通常只喜欢创建代表实际业务实体的类。在这种情况下,我认为“groupmembers”在您的代码中不代表任何有价值的东西。对我来说,ORM 应该将数据库映射到您的业务对象。这意味着您的类不必完全反映数据库布局。
另外,我怀疑通过实现 GroupMembers,您最终会在您的用户类和组类中得到一些令人讨厌的集合。IE。组类将包含用户列表以及引用用户的组成员列表,反之亦然。对我来说,这并不是那么干净,并且会使维护和传播对表的更改变得更加困难。
我建议按照您的建议将联接表保留在数据库中,并在用户中添加名为 waitingtoaccept 的组列表,并(如果也有意义)在组中添加名为 waitingtoaccept 的用户列表。
然后,这些将根据 waitingtoaccept 标志从数据库中的联接表中提取它们的值。
其他提示
是的,当然您需要另一个类,例如 UserGroupBridge。另一个好的副作用是您可以修改用户成员资格和组成员,而无需将可能繁重的用户/组对象加载到 NHibernate 会话中。
干杯。
不隶属于 StackOverflow