是的,在here和here之前询问过。我很好奇,我正在考虑的方法在架构上是否合理。这是一个很好的数据模型来实现强类型角色吗?
让我试图描述想什么,我能够与我的对象模型做开始:
class Person {
ISet<Roles> Roles { get; set; }
}
class RoleDefinition {
string Name { get; set; }
}
class RoleAssignment {
RoleDefinition Definition { get; set; }
Person Person { get; set; }
}
class UserRole : RoleAssignment {
public virtual string Login { get; set; }
public virtual string Password { get; set; }
}
随着意图是能够与以下方式角色的工作:
// Find all "users" with a matching login
from user in userRolesRepository.FindAll(u => u.Login.StartsWith("abc"))
select user.Person;
要做到这一点,我正在考虑以下数据模型
Person table (Id, Name)
RoleDefinition table (Id, Name)
RoleAssignment table (Id, DefId, PersonId)
UserRole table (RoleAssignmentId, Login, Password)
AdminRole table (RoleAssignmentId, ...)
我会地图UserRole和AdminRole作为NHibernate中RoleAssignment的联合子类。
所以,Person和UserRole和AdminRole之间是1:1,UserRole和RoleAssignment之间是1:1,RoleAssignment和RoleDefinition之间是1:1。
我的问题是:这真的是一个很好的模型?
有没有更好的方法来建模,而不会失去每个角色具有强类型,可查询属性的能力?考虑到随着我们的发展,我将在系统中增加更多的角色,这将如何扩展?
谢谢尼古拉斯的详细解答。从我的原始问题描述中不清楚,但是想法是让角色具有可查询属性。从我的具体情况来看,更具体的例子是具有登录名和密码的“用户”角色,以及具有分配类别列表的“学生”角色。一个人可能是一个用户和/或一个学生,我可以用他们的属性查询任一角色。我将添加约束条件,以便角色只能分配给用户一次,因此一个人永远不会得到两个登录名和密码。 – Ragesh 2009-11-09 04:45:14